【发布时间】:2018-11-24 14:54:04
【问题描述】:
我正在尝试在 linux 上用 c 编写一个 mock-shell,但遇到了这个问题:
我需要在后台运行一些进程,在前台运行一些进程。 为了防止前台进程变成僵尸,我可以使用wait(),但是如何防止后台进程变成僵尸呢?
【问题讨论】:
标签: c linux operating-system wait zombie-process
我正在尝试在 linux 上用 c 编写一个 mock-shell,但遇到了这个问题:
我需要在后台运行一些进程,在前台运行一些进程。 为了防止前台进程变成僵尸,我可以使用wait(),但是如何防止后台进程变成僵尸呢?
【问题讨论】:
标签: c linux operating-system wait zombie-process
您无法阻止任何进程成为僵尸,但您可以限制它保持一的时间。一个进程从它终止到它的父进程通过调用wait() or waitpid() 或其他服务于该目的的函数收集它的时间都是僵尸。这个时间确实可以做得很短,例如,如果子进程终止时父进程已经在等待,但终止和后续收集不同步。
后台进程和前台进程的区别主要在于对终端的控制;它与管理子进程的父 shell 几乎没有关系。您通过wait()、等收集属于后台作业的子进程,与收集属于前台作业的子进程的方式完全相同。正如@Someprogrammerdude 已经描述的那样,您可以使用waitpid() 和W_NOHANG 标志来收集已经终止的孩子而无需等待未终止的孩子。仍然需要在适当的时间插入此类等待,并且交互式 shell 似乎很常见围绕从用户读取命令来安排这种等待。
【讨论】:
您可以轮询,使用带有W_NOHANG 标志的waitpid。或者您可以添加一个 SIGCHLD 处理程序,每次子进程结束(或有其他状态更改)时都会调用该处理程序。
【讨论】: