SIGCHID:


子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。


要想不产生僵尸进程还有另外一种办法:父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。

代码:

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<signal.h>
  4 #include<sys/types.h>
  5 #include<wait.h>
  6 #include<unistd.h>
  7 #include<stdlib.h>
  8 void clear_pthread(int signal)
  9 {   
 10     int status=0;
 11     while(waitpid(-1,&status,WNOHANG))
 12     {   
 13         printf("sig:%d,code:%d\n",status&0xff,(status>>8)&0xff);
 14     }
 15 
 16 }
 17 int main()
 18 {
 19 
 20     pid_t id=fork();
 21     if(id<0)
 22     {
 23         perror("failure");
 24         exit(1);
 25     }
 26     else if(id==0)
 27     {
 28         sleep(10);
 29         printf("this is a child process\n");
 30         exit(1);
 31     }
 32     else if(id>0)
 33     {   
 34         while(1)
 35         {
 36           signal(SIGCHLD,clear_pthread);
 37         }
 38      
 39 
 40     }
 41     return 0;
 42 }   

 结果:
[admin@www SIGNAL]$ gcc -o sigchld sigchld.c
[admin@www SIGNAL]$ ./sigchld
this is a child process
sig:0,code:1
^C