UNIX:退出时等待进程子进程?

时间:2014-05-06 01:07:50

标签: c linux unix fork wait

假设我有一个C程序,它使用fork()exec()生成一些子进程。父母保留其子女的pid列表。偶尔,它会使用waitWNOHANG进行尝试,并通知用户是否已终止。

程序然后决定退出。我必须在剩余的子进程上明确kill然后wait,以便它们不会成为僵尸吗?根据维基百科:

“不应将僵尸进程与孤儿进程混淆:孤儿进程是一个仍在执行的进程,但其父进程已经死亡。这些进程不会成为僵尸进程;相反,它们会被init采用(进程) ID 1),等待其子女。“

所以这表明等待是不必要的。但是,如果该程序的孩子已经成为僵尸,并且该程序在等待之前退出该怎么办?基本上,如果父母退出,父母的子女处理僵尸是否会被正确地回收?

2 个答案:

答案 0 :(得分:1)

当进程退出时,所有子进程都成为进程1(init)的子进程。它会迅速收获所有僵尸。任何仍在运行的孩子都将继续作为过程1的孩子运行。

有些人可能会说,在退出之前收获你的僵尸会更好,但这并不重要。

答案 1 :(得分:1)

不,这是僵尸进程的实用定义。 技术上僵尸进程是任何已终止但仍在进程表中的进程;但是,如果父进程仍然在读取进程表并注意到子进程已终止,则无害。如果父进程没有读取进程表并导致死孩子被“收获”,那么进程就更有意义地成为 zombie 。但是,现代init应该wait快速{{1}}任何不死的孩子,以防止长期僵尸漫游系统。

如果仔细考虑这一点,则意味着所有子进程终止成为僵尸一段时间。

UNIX是病态的。