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

标签 c linux unix fork wait

假设我有一个 C 程序,它使用 fork()exec() 生成一些子进程。父级保留其子级的 pid 列表。偶尔,它会尝试使用 WNOHANG waiting 并在它们已终止时通知用户。

然后程序决定退出。我是否必须显式地kill 然后wait 剩余的子进程,这样它们才不会变成僵尸进程?根据维基百科:

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

所以这表明等待是不必要的。但是如果程序的 child 已经变成了僵尸,程序在等待他们之前就退出了怎么办?基本上,如果父进程退出,父进程的僵尸子进程是否总是会被正确回收?

最佳答案

不,那是僵尸进程的实际定义。 技术上僵尸进程是任何已终止但仍在进程表中的进程;但是,如果父进程仍在读取进程表并注意到子进程已终止,则无害。如果父进程没有读取进程表就退出并导致死去的子进程被“收割”,则进程更像是一个僵尸。然而,现代 init 应该快速等待任何不死的 child ,以防止长期存在的僵尸在系统中漫游。

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

UNIX 是病态的。

关于c - UNIX:退出时等待进程子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484397/

相关文章:

c - 可变长度数组的原型(prototype)

c - 以 UTF-8 格式读取 ncurses stdin

c - 取消线程后如何杀死所有使用 pthread_create 创建的子进程?

java - local_policy.jar 和 US_export_policy.jar 与 Unlimited Strength Vs Default 不同。

c - 在 C (Linux) 中,我如何才能知道 squareroot(n) = Integer

c - 二元矩阵 vector 乘法的本质

c++ - 是否可以缓存从 MapViewOfFile 返回的映射区域?

c - 如何将包含通配符的路径转换为 ​​C 程序中相应的文件条目?

bash - 使用 bash : write bit representation of integer to file

linux - 无法在 bash 中分配变量。获取命令未找到错误