一个没有生育的孩子及其未来

时间:2011-12-13 22:41:52

标签: c signals freebsd zombie-process sigchld

因此,当孩子死亡时,父母会获得SIGCHLD但如果父母在执行wait()之前死亡,则该孩子将被重新授予init。在这个时间点,孩子是zombie,即<defunct>

接下来会发生什么?

init对那个孩子做等待()吗?如果是,它什么时候做的?关于时间限制的任何保证吗?

1 个答案:

答案 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