【问题标题】:How to wait() only for some child processes and prevent zombies如何仅为某些子进程等待()并防止僵尸
【发布时间】:2018-11-24 14:54:04
【问题描述】:

我正在尝试在 linux 上用 c 编写一个 mock-shell,但遇到了这个问题:

我需要在后台运行一些进程,在前台运行一些进程。 为了防止前台进程变成僵尸,我可以使用wait(),但是如何防止后台进程变成僵尸呢?

【问题讨论】:

    标签: c linux operating-system wait zombie-process


    【解决方案1】:

    您无法阻止任何进程成为僵尸,但您可以限制它保持一的时间。一个进程从它终止到它的父进程通过调用wait() or waitpid() 或其他服务于该目的的函数收集它的时间都是僵尸。这个时间确实可以做得很短,例如,如果子进程终止时父进程已经在等待,但终止和后续收集不同步。

    后台进程和前台进程的区别主要在于对终端的控制;它与管理子进程的父 shell 几乎没有关系。您通过wait()收集属于后台作业的子进程,与收集属于前台作业的子进程的方式完全相同。正如@Someprogrammerdude 已经描述的那样,您可以使用waitpid()W_NOHANG 标志来收集已经终止的孩子而无需等待未终止的孩子。仍然需要在适当的时间插入此类等待,并且交互式 shell 似乎很常见围绕从用户读取命令来安排这种等待。

    【讨论】:

      【解决方案2】:

      您可以轮询,使用带有W_NOHANG 标志的waitpid。或者您可以添加一个 SIGCHLD 处理程序,每次子进程结束(或有其他状态更改)时都会调用该处理程序。

      【讨论】:

      • 不确定第一句话是什么意思,但我会尝试使用 SIGCHILD 处理程序。谢谢
      猜你喜欢
      • 2013-06-05
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2010-11-12
      • 2017-06-15
      相关资源
      最近更新 更多