SIGCHLD信号:当一个进程停止或者结束的时候,会发送一个SIGCHLD信号给它的父进程,父进程默认忽略这个信号。
SIGCHLD信号产生的条件:
子进程结束
子进程接收到SIGSTOP(19)信号停止时
子进程在停止状态时接受到SIGCONT信号恢复运行时
使用SIGCHLD信号可以解决僵尸进程的问题(僵尸进程:指子进程结束后,父进程没有回收子进程以及释放子进程的资源,导致子进程成为僵尸进程)
实例:
#define _XOPEN_SOURCE
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <wait.h>
void m_fun(int signum){
printf("捕捉到的信号为:%d\n",signum);
while(1){
int pid = waitpid(-1,NULL,WNOHANG);
if(pid> 0){
printf("%d child process die\n",pid);
}else if(pid==0){
break;
}else if(pid==-1){
break;
}
}
}
int main(){
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGCHLD);
sigprocmask(SIG_BLOCK,&set,NULL);
pid_t pid;
for(int i=0;i<20;i++){
pid = fork();
if(pid==0){
break;
}
}
if(pid>0){
//父进程
struct sigaction act;
act.sa_flags=0;
act.sa_handler = m_fun;
sigemptyset(&act.sa_mask);
sigaction(SIGCHLD,&act,NULL);
sigprocmask(SIG_UNBLOCK,&set,NULL);
while(1){
printf("parent procress: %d\n",getgid());
sleep(2);
}
}else if(pid==0){
//子进程
printf("children process : %d\n",getpid());
}
return 0;
}