【问题标题】:UNIX: Waiting on process children upon exit?UNIX:退出时等待进程子进程?
【发布时间】:2014-05-06 01:07:50
【问题描述】:

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

然后程序决定退出。我必须明确kill 然后wait 在剩余的子进程上,以免它们变成僵尸吗?根据维基百科:

"僵尸进程不应与孤儿进程混淆:孤儿进程是仍在执行中,但其父进程已经死亡的进程。这些不会成为僵尸进程;相反,它们被 init (process ID 1),它等待它的孩子。"

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

【问题讨论】:

    标签: c linux unix fork wait


    【解决方案1】:

    不,这是僵尸进程的实用定义。 技术上僵尸进程是任何已经终止但仍在进程表中的进程;但是,如果父进程仍在附近以读取进程表并注意子进程已终止,则无害。如果父进程在没有读取进程表并导致死去的子进程被“收割”的情况下退出,则进程更有意义地是一个僵尸。然而,现代的init 应该迅速wait 对付任何不死的孩子,以防止长期存在的僵尸在系统中漫游。

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

    UNIX 是病态的。

    【讨论】:

      【解决方案2】:

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

      有些人可能会争辩说,最好在离开之前收割你的僵尸,但这并不重要。

      【讨论】:

      • 正如 Wikipedia 所说,未收割的子节点可能是父程序中存在错误的标志,是不常见的 [但有意的] 编程决定,或者最终是操作系统中的错误。
      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多