假设我有一个 C 程序,它使用 fork()
和 exec()
生成一些子进程。父级保留其子级的 pid
列表。偶尔,它会尝试使用 WNOHANG
wait
ing 并在它们已终止时通知用户。
然后程序决定退出。我是否必须显式地kill
然后wait
剩余的子进程,这样它们才不会变成僵尸进程?根据维基百科:
“不应将僵尸进程与孤儿进程混淆:孤儿进程是仍在执行但其父进程已死亡的进程。这些不会成为僵尸进程;相反,它们被 init 采用(进程ID 1),等待它的 child 。”
所以这表明等待是不必要的。但是如果程序的 child 已经变成了僵尸,程序在等待他们之前就退出了怎么办?基本上,如果父进程退出,父进程的僵尸子进程是否总是会被正确回收?
最佳答案
不,那是僵尸进程的实际定义。 技术上僵尸进程是任何已终止但仍在进程表中的进程;但是,如果父进程仍在读取进程表并注意到子进程已终止,则无害。如果父进程没有读取进程表就退出并导致死去的子进程被“收割”,则进程更像是一个僵尸。然而,现代 init
应该快速等待
任何不死的 child ,以防止长期存在的僵尸在系统中漫游。
如果您仔细考虑这一点,这意味着终止的所有子进程都会在一段时间内变成僵尸进程。
UNIX 是病态的。
关于c - UNIX:退出时等待进程子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484397/