子进程在终止时会给父进程发 SIGCHLD 信号,该信号的默认处理动作是忽略,父进程可以自定义 SIGCHLD 信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用 wait 清理子进程即可。

一、子进程退出时给父进程发送信号

vim mysig.c

【Linux】子进程的异步等待方式

【Linux】子进程的异步等待方式

vim Makefile

【Linux】子进程的异步等待方式

运行结果如下:

【Linux】子进程的异步等待方式

我们可以看到子进程退出时给父进程发送了 17 号信号,我们用命令 kill -l 查看信号列表,可以看到 17 号信号就是 SIGCHLD 信号。

【Linux】子进程的异步等待方式



二、父进程异步等待子进程

vim sigchld.c

【Linux】子进程的异步等待方式

【Linux】子进程的异步等待方式

vim Makefile

【Linux】子进程的异步等待方式

运行结果如下:

【Linux】子进程的异步等待方式

        我们可以发现父进程 fork 出子进程,子进程调用 exit(1)  终止,父进程自定义 SIGCHLD 信号的处理函数,在其中调用 wait 获得了子进程的退出状态并打印。父进程先每隔一秒打印一次,五秒后子进程打印,然后子进程彻底退出,父进程一直打印直到我们强制停止它。



相关文章: