我正在尝试在Linux上的C语言中编写一个模拟外壳,并陷入了这个问题:
我需要在后台运行某些进程,并在前台运行某些进程。 为了防止前台进程变成僵尸,我可以使用wait(),但是如何防止后台进程变成僵尸?
答案 0 :(得分:0)
您可以使用带有waitpid
标志的W_NOHANG
来进行投票。或者,您可以添加一个SIGCHLD
处理程序,该处理程序将在每次子进程结束(或具有其他状态更改)时调用。
答案 1 :(得分:0)
您不能阻止任何进程成为僵尸,但是您可以限制它保留的时间。从进程终止到其父进程通过调用wait()
or waitpid()
或达到该目的的另一个函数收集进程的时间,僵尸程序就是一个僵尸。确实可以将时间缩短得很短,例如,如果子进程终止时父进程已经在等待,但是终止和随后的收集不同步。
后台进程和前台进程之间的区别主要在于终端的控制;它与管理子进程的父shell无关。您可以通过wait()
, etc 。收集属于后台作业的子进程,与收集属于前台作业的子进程的方式完全相同。您可以使用带有waitpid()
标志的W_NOHANG
来收集已经终止的子级,而不必等待未终止的子级,如@Someprogrammerdude所述。仍然需要在适当的时间插入这样的等待,对于交互式shell来说,安排从用户读取命令的时间安排是很常见的。