因此,当孩子死亡时,父母会获得SIGCHLD
但如果父母在执行wait()之前死亡,则该孩子将被重新授予init
。在这个时间点,孩子是zombie
,即<defunct>
。
接下来会发生什么?
init
对那个孩子做等待()吗?如果是,它什么时候做的?关于时间限制的任何保证吗?
答案 0 :(得分:2)
是的,init
会立即收获所有孩子。如果你创建一个忽略SIGCHLD
并累积许多僵尸的进程,你可以通过你描述的机制杀死那个父进程来摆脱它们。
此处参考是在多用户模式下init
的主循环。通过requested_transition
信号设置init
(例如,经典kill -1 1
来阅读更新后的inittab
):
while (!requested_transition)
if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
collect_child(pid);
(collect_child
处理init对流程有特殊兴趣的情况,例如登录shell现在需要新的getty
)