14-总结
26.4 总结
使用wait()和waitpid()(以及其他相关函数),父进程可以得到其终止或停止子进程的状态。该状态表明子进程是正常终止(带有表示成功或失败的退出状态),还是异常中止,因收到某个信号而停止,还是因收到SIGCONT信号而恢复执行。
如果子进程的父进程终止,那么子进程将变为孤儿进程,并为进程 ID 为 1 的init进程接管。
子进程终止后会变为僵尸进程,仅当其父进程调用 wait()(或类似函数)获取子进程退出状态时,才能将其从系统中删除。在设计长时间运行的程序,诸如shell程序以及守护进程(daemon)时,应总是捕获其所创建子进程的状态,因为系统无法杀死僵尸进程,而未处理的僵尸进程最终将塞满内核进程表。
捕获终止子进程的一般方法是为信号SIGCHLD设置信号处理程序。当子进程终止时(也可选择子进程因信号而停止时),其父进程会收到SIGCHLD信号。还有另一种移植性稍差的处理方法,进程可选择将对SIGCHLD信号的处置置为忽略(SIG_IGN),这时将立即丢弃终止子进程的状态(因此其父进程从此也无法获取到这些信息),子进程也不会成为僵尸进程。
更多信息
请参考列于24.6节中的更多信息来源。