- 一、SIGCHLD信号
- 二、代码示例(使用SIGCHLD信号解决僵尸进程问题)
- 总结
一、SIGCHLD信号
SIGCHLD信号产生的3个条件:
1.子进程结束
2.子进程暂停了
3.子进程继续运行
他们都会给父进程发送该信号,父进程默认忽略该信号。
#include总结#include #include #include #include #include void myFun(int num) { printf("捕捉到的信号:%dn",num); //回收子进程PCB资源 //while(1) //{ // wait(NULL); //} while(1) { int ret =waitpid(-1,NULL,WNOHANG); if(ret>0) { printf("child die,pid =%dn",ret); }else if(ret ==0) { //说明还有子进程 break; }else if(ret==-1) { break; } } } int main() { //提前设置好阻塞信号集,阻塞SIGCHLD,因为有可能子进程很快结束,父进程还没有注册完信号捕捉 sigset_t set; sigemptyset(&set); sigaddset(&set,SIGCHLD); sigprocmask(SIG_BLOCK,&set,NULL); //注册完信号捕捉以后,解除阻塞 sigprocmask(SIG_UNBLOCK,&set,NULL); //创建一些子进程 pid_t pid; for(int i=0;i<20;i++) { pid=fork(); if(pid==0) { break; } } if(pid>0) {//父进程 //捕捉子进程死亡时发送的SIGCHLD信号 struct sigaction act; act.sa_flags=0; act.sa_handler=myFun; sigemptyset(&act.sa_mask); sigaction(SIGCHLD,&act,NULL); while(1) { printf("parent process pid:%dn",getpid()); sleep(2); } }else if(pid==0) {//子进程 printf("child process pid:%dn",getpid()); } return 0; }
今天主要给大家介绍了SIGCHLD信号.



