等到所有后台作业都终止,C

时间:2016-02-17 19:19:17

标签: process fork wait pid

我知道waitpid(-1 ...)如何允许我等到所有孩子都完成,例如waitpid(-1,& status)。但是,我怎么能等到所有后台进程完成?有人建议我可以使用相同的waitpid(循环?)来实现这一点,但我不知道如何。

要清楚,我实现了一个shell,并且需要添加一个新的内置命令wait,它等待所有后台作业终止后再返回到提示符。

我在SO上的其他地方读到"您还需要定期调用带有WNOHANG选项的waitpid() - 例如,在显示shell提示之前。这将允许您检测后台进程何时退出或停止"但是,孩子!=背景。所以即使我不相信。

编辑:

我最终只是在做(等待(NULL)> 0);这就是它,它起作用了。但我仍然感到困惑的是,我不想区分前景和背景,因为我实施的等待只等待背景过程,所有孩子在眼睛中是平等的wait()或waitpid()。

所以,我等待使用wait()或waitpid()的孩子不一定是后台进程。我错了吗?

2 个答案:

答案 0 :(得分:1)

由于您在实现shell的过程中询问,并且显然您的shell支持足够的作业控制以具有后台进程的概念,因此可以合理地假设您的实现将具有跟踪后台作业的表。该表可以并且应该跟踪与每个作业相关联的过程的PID。

掌握了这些PID后,您可以waitpid()查看特定后台作业,直到表格中没有其他作业,或者您可以waitpid(-1)收集 任何和每个工作,循环,直到表中没有更多的后台工作。

答案 1 :(得分:0)

如果要实现后台进程(和作业控制)并捕获终止(至少),则必须为SIGCHLD设置信号处理程序,并在其中调用wait(-1)。这将让您的shell接收后台进程终止的异步通知。例如,您可以查看Catching SIGCHLD并讨论此问题。