关于linux环境下信号SIGCHLD的排队机制

下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中是不许要这样做的。

signal(SIGCHLD,SIG_IGN);就可以了,我已经子啊ubuntu12.04上面做过了测试!

1#include<sys/types.h>

2#include<unistd.h>

3#include<stdio.h>

4#include<stdlib.h>

5#include<signal.h>

6intmain()

7{

8signal(SIGCHLD,SIG_IGN);

9pid_ttid=fork();

10if(tid==0){

11

12

13printf("childprocess%d\n",getpid());

14exit(0);

15

16}elseif(tid>0){

17

18

19printf("parentprocess%d\n",getpid());

20while(1==1)

21{

22

23

24}

25}

26

27}

result:

不使用signal(SIGCHLD,SIG_IGN);

aircoder@aircoder-ThinkPad-T430:~/c/test$psaux|grepaaa|grep-vgrep

aircoder346998.20.04152348pts/0R+23:200:10./aaa

aircoder34700.00.000pts/0Z+23:200:00[aaa]<defunct>

使用signal(SIGCHLD,SIG_IGN);

aircoder@aircoder-ThinkPad-T430:~/c/test$psaux|grepbbb|grep-vgrep

aircoder348287.30.04152352pts/0R+23:200:05./bbb

aircoder@aircoder-ThinkPad-T430:~/c/test$

《《网络摘要

一直对这个问题没有深入的思考过。最近由于项目的需要终于弄清了这个问题。

以下文字是抄袭+理解+估计:

在linux系统中,子进程的正常/异常终止都会给父进程发送SIGCHLD的信号,当父进程接收到子进程(第一个)信号进行wait()或waitpid()时,会屏蔽掉下一个的SIGCHLD信号,实际的效果就是在信号处理函数返回前不会重入。

那么当父进程在执行信号处理函数时,又有子进程(第二个)退出,那么信号会被阻塞并等待处理,假如(第三个)又来了,那么它是被抛弃的,后续的都会抛弃。。。

所以说信号是阻塞但不排队的。

如果子进程可能会同时退出,那么父进程需要这样来处理以防止僵尸进程的出现:

pid_tchildpid;

while((childpid=waitpid(-1,NULL,WNOHANG))>0)

{

...

}

这样,即使出现子进程同时退出的情况,SIGCHLD的信号被抛弃也没有关系。waitpid会收集所有当前已终止(实际就是处于僵尸状态)的子进程,直到没有这样的进程状态需要收集(返回0)

》》