一句话总结:子进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
看下如何捕捉
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
void sigFun(int sig)
{
printf("sigFun begin\n");
pid_t pid;
int status;
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
{
printf("catch child process, pid:%d\n", pid);
}
printf("sigFun end\n");
return;
}
int main()
{
pid_t pid1, pid2;
signal(SIGCHLD, sigFun);
pid1 = fork();
if (pid1 < 0)
return -1;
if(0 == pid1)
{
sleep(5);
printf("child sleep 5 sec\n");
}
else
{
sleep(10);
printf("parent sleep 10 sec\n");
}
}
signal(SIGCHLD, sigFun); //表示SIGCHLD信号由函数sigFun处理。
当子进程结束后,发送SIGCHLD给父进程,此时由sigFun捕捉信号并处理。sleep中的父进程也立马被唤醒继续往下执行。
zjy@ubuntu:~/cpp$ ./main
child sleep 5 sec
sigFun begin
catch child process, pid:4426
sigFun end
parent sleep 10 sec
zjy@ubuntu:~/cpp$