Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2594394
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类: LINUX

2010-10-28 12:50:31

19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

  20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

  21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

  22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

  23) SIGURG 有紧急数据或out-of-band数据到达socket时产生.

  24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变

  25) SIGXFSZ 超过文件大小资源限制.

  26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

  27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

  28) SIGWINCH 窗口大小改变时发出.

  29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.

  30) SIGPWR Power failure

  对于2和3信号量好理解,屏蔽ctrl+c和ctrl+\。但是1信号量到底什么作用呢?

  转自http://blog.csdn.net/cugxueyu/archive/2008/01/16/2046565.aspx

  SIGHUP信号与控制终端

  UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。

  SIGHUP会在以下3种情况下被发送给相应的进程:

  1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)

  2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程

  3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

  系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

  下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。login shell是session首进程。

  首先写一个测试程序,代码如下:

  #include

  #include

  char **args;

  void exithandle(int sig)

  ...{

  printf("%s : sighup received ",args[1]);

  }

  int main(int argc,char **argv)

  ...{

  args = argv;

  signal(SIGHUP,exithandle);

  pause();

  return 0;

  }

  程序中捕捉SIGHUP信号后打印一条信息,pause()使程序暂停。

  编译后的执行文件为sigtest。

  1、命 令:sigtest front > tt.txt

  操 作:关闭终端

  结 果:tt.txt文件的内容为front : sighup received

  原 因: sigtest是前台进程,终端关闭后,根据上面提到的第1种情况,login shell作为session首进程,会收到SIGHUP信号然后退出。根据第2种情况,sigtest作为前台进程,会收到login shell发出的SIGHUP信号。

  2、命 令:sigtest back > tt.txt &

  操 作:关闭终端

  结 果:tt.txt文件的内容为 back : sighup received

  原 因: sigtest是提交的job,根据上面提到的第1种情况,sigtest会收到SIGHUP信号。

  3、命 令:写一个shell,内容为[sigtest &],然后执行该shell

  操 作:关闭终端

  结 果:ps -ef | grep sigtest 会看到该进程还在,tt文件为空

  原 因: 执行该shell时,sigtest作为job提交,然后该shell退出,致使sigtest变成了孤儿进程,不再是当前session的job了,因此sigtest即不是session首进程也不是job,不会收到SIGHUP。同时孤儿进程属于后台进程,因此login shell退出后不会发送SIGHUP给sigtest,因为它只将该信号发送给前台进程。第3条说过若进程组变成孤儿进程组的时候,若有进程处于停止状态,也会收到SIGHUP信号,但sigtest没有处于停止状态,所以不会收到SIGHUP信号。

  4、命 令:nohup sigtest > tt

  操 作:关闭终端

  结 果:tt文件为空

  原 因: nohup可以防止进程收到SIGHUP信号

  至此,我们就清楚了何种情况下终端关闭后进程会退出,何种情况下不会退出。

  要想终端关闭后进程不退出有以下几种方法,均为通过shell的方式:

  1、编写shell,内容如下

  trap "" SIGHUP #该句的作用是屏蔽SIGHUP信号,trap可以屏蔽很多信号

  sigtest

  2、nohup sigtest 可以直接在命令行执行,

  若想做完该操作后继续别的操作,可以 nohup sigtest &

  3、编写shell,内容如下

  sigtest &

  其实任何将进程变为孤儿进程的方式都可以,包括fork后父进程马上退出。

阅读(517) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-16 21:59:35

学习了,多谢楼主分享哦!也欢迎广大linux爱好者来我的论坛一起讨论arm哦!www.lt-net.cn

chinaunix网友2011-03-16 21:59:35

学习了,多谢楼主分享哦!也欢迎广大linux爱好者来我的论坛一起讨论arm哦!www.lt-net.cn