SIGCHLD 信号

来源:互联网 发布:乐乎pt被关了 编辑:程序博客网 时间:2024/06/06 00:09

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]$ ./sigchldthis is a child processsig:0,code:1^C


本文出自 “liveyoung” 博客,转载请与作者联系!

0 0
原创粉丝点击