假设我有一个C程序,它使用fork()
和exec()
生成一些子进程。父母保留其子女的pid
列表。偶尔,它会使用wait
对WNOHANG
进行尝试,并通知用户是否已终止。
程序然后决定退出。我必须在剩余的子进程上明确kill
然后wait
,以便它们不会成为僵尸吗?根据维基百科:
“不应将僵尸进程与孤儿进程混淆:孤儿进程是一个仍在执行的进程,但其父进程已经死亡。这些进程不会成为僵尸进程;相反,它们会被init采用(进程) ID 1),等待其子女。“
所以这表明等待是不必要的。但是,如果该程序的孩子已经成为僵尸,并且该程序在等待之前退出该怎么办?基本上,如果父母退出,父母的子女处理僵尸是否会被正确地回收?
答案 0 :(得分:1)
当进程退出时,所有子进程都成为进程1(init)的子进程。它会迅速收获所有僵尸。任何仍在运行的孩子都将继续作为过程1的孩子运行。
有些人可能会说,在退出之前收获你的僵尸会更好,但这并不重要。
答案 1 :(得分:1)
不,这是僵尸进程的实用定义。 技术上僵尸进程是任何已终止但仍在进程表中的进程;但是,如果父进程仍然在读取进程表并注意到子进程已终止,则无害。如果父进程没有读取进程表并导致死孩子被“收获”,那么进程就更有意义地成为 zombie 。但是,现代init
应该wait
快速{{1}}任何不死的孩子,以防止长期僵尸漫游系统。
如果仔细考虑这一点,则意味着所有子进程终止成为僵尸一段时间。
UNIX是病态的。