如何仅对某些子进程使用wait()并防止僵尸

时间:2018-11-24 14:54:04

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

我正在尝试在Linux上的C语言中编写一个模拟外壳,并陷入了这个问题:

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

2 个答案:

答案 0 :(得分:0)

您可以使用带有waitpid标志的W_NOHANG来进行投票。或者,您可以添加一个SIGCHLD处理程序,该处理程序将在每次子进程结束(或具有其他状态更改)时调用。

答案 1 :(得分:0)

您不能阻止任何进程成为僵尸,但是您可以限制它保留的时间。从进程终止到其父进程通过调用wait() or waitpid()或达到该目的的另一个函数收集进程的时间,僵尸程序就是一个僵尸。确实可以将时间缩短得很短,例如,如果子进程终止时父进程已经在等待,但是终止和随后的收集不同步。

后台进程和前台进程之间的区别主要在于终端的控制;它与管理子进程的父shell无关。您可以通过wait() etc 。收集属于后台作业的子进程,与收集属于前台作业的子进程的方式完全相同。您可以使用带有waitpid()标志的W_NOHANG来收集已经终止的子级,而不必等待未终止的子级,如@Someprogrammerdude所述。仍然需要在适当的时间插入这样的等待,对于交互式shell来说,安排从用户读取命令的时间安排是很常见的。