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 } 结果: [[email protected] SIGNAL]$ gcc -o sigchld sigchld.c [[email protected] SIGNAL]$ ./sigchld this is a child process sig:0,code:1 ^C
时间: 2024-10-26 22:32:50