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
本文出自 “liveyoung” 博客,转载请与作者联系!