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

C UNIX:在退出时等待进程子进程?,c,linux,unix,fork,wait,C,Linux,Unix,Fork,Wait,假设我有一个C程序,它使用fork()和exec()生成一些子进程。父对象保留其子对象的pids列表。每隔一段时间,它会尝试使用WNOHANG对他们进行waiting,并在他们终止时通知用户 然后程序决定退出。我必须显式地杀死,然后等待剩下的子进程,这样它们就不会变成僵尸了吗?根据维基百科: 僵尸进程不应与孤立进程混淆:孤立进程是一个仍在执行但其父进程已死亡的进程。这些进程不会成为僵尸进程,而是由等待其子进程的init(进程ID 1)采用 因此,这表明等待是不必要的。但是如果程序的孩子已经变成僵

假设我有一个C程序,它使用
fork()
exec()
生成一些子进程。父对象保留其子对象的
pid
s列表。每隔一段时间,它会尝试使用
WNOHANG
对他们进行
wait
ing,并在他们终止时通知用户

然后程序决定退出。我必须显式地
杀死
,然后
等待
剩下的子进程,这样它们就不会变成僵尸了吗?根据维基百科:

僵尸进程不应与孤立进程混淆:孤立进程是一个仍在执行但其父进程已死亡的进程。这些进程不会成为僵尸进程,而是由等待其子进程的init(进程ID 1)采用


因此,这表明等待是不必要的。但是如果程序的孩子已经变成僵尸,程序在等待他们之前就退出了呢?基本上,如果父进程退出,则作为僵尸的父进程的子进程是否总是可以正确回收?

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

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

不,这是僵尸过程的实际定义。从技术上讲,僵尸进程是任何已终止但仍在进程表中的进程;但是,如果父进程仍在读取进程表并注意到子进程已终止,则这并没有什么害处。如果父进程在没有读取进程表的情况下退出并导致死亡的子进程被“收获”,那么进程就更像僵尸。然而,现代的
init
应该迅速
等待
任何不死生物的后代,防止长期存在的僵尸在系统中漫游

如果你仔细考虑,这意味着终止的所有子进程都会在一段时间内变成僵尸。


UNIX是病态的。

正如维基百科所说,未读的子系统可能是父程序中存在缺陷的迹象,可能是一个不寻常的[但有意的]编程决策,也可能是操作系统中的缺陷。