如何仅针对某些子进程等待()并防止僵尸

How to wait() only for some child processes and prevent zombies

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

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

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

你不能阻止任何进程变成僵尸,但你可以限制它保持的时间。一个进程从它终止到它的 parent 通过调用 wait() or waitpid() 或另一个用于该目的的函数收集它的时间是一个僵尸。这个时间确实可以做得很短,例如,如果 parent 进程在 child 终止时已经在等待,但终止和后续收集不是同步的。

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