比方说,我有一个C程序,它使用fork()
和exec()
生成一些subprocess。 父母保存了孩子的pid
列表。 有一段时间,它试图用WNOHANG
wait
他们,并通知用户是否已经终止。
程序然后决定退出。 我必须明确kill
,然后wait
其余的subprocess,使他们不成为僵尸? 根据维基百科:
“僵尸进程不应与孤立进程相混淆:孤儿进程是一个仍在执行的进程,但是其父进程已经死亡,这些进程不会成为僵尸进程,而是被init(进程ID 1)所采用,等待对其子女“。
所以这表明等待是不必要的。 但是,如果该计划的孩子已经成为僵尸,该计划在等待之前退出? 基本上,如果父母离开,父母的孩子是否会正常回收僵尸?
不,这是僵尸进程的实际定义。 从技术上讲 ,僵尸进程是已经终止但仍在进程表中的任何进程; 但是,如果父进程仍在读取进程表并注意到子进程已终止,那么这并不会造成危害。 如果父母不读取处理表并导致死亡孩子“收割”,则处理更有意义的是僵尸 。 然而,现代init
应该快速的wait
任何不死生物的孩子,防止漫长的僵尸漫游系统。
如果仔细考虑这一点,就意味着所有终止成为僵尸的子进程会持续一段时间。
UNIX是病态的。
当进程退出时,所有的孩子都成为进程1(init)的子进程。 它会及时收获所有的僵尸。 任何仍在运行的孩子将继续作为过程1的孩子运行。
有些人可能会争辩说,在退出之前收获僵尸会更好,但这并不重要。