我知道waitpid(-1 ...)如何允许我等到所有孩子都完成,例如waitpid(-1,& status)。但是,我怎么能等到所有后台进程完成?有人建议我可以使用相同的waitpid(循环?)来实现这一点,但我不知道如何。
要清楚,我实现了一个shell,并且需要添加一个新的内置命令wait,它等待所有后台作业终止后再返回到提示符。
我在SO上的其他地方读到"您还需要定期调用带有WNOHANG选项的waitpid() - 例如,在显示shell提示之前。这将允许您检测后台进程何时退出或停止"但是,孩子!=背景。所以即使我不相信。
编辑:
我最终只是在做(等待(NULL)> 0);这就是它,它起作用了。但我仍然感到困惑的是,我不想区分前景和背景,因为我实施的等待只等待背景过程,所有孩子在眼睛中是平等的wait()或waitpid()。
所以,我等待使用wait()或waitpid()的孩子不一定是后台进程。我错了吗?
答案 0 :(得分:1)
由于您在实现shell的过程中询问,并且显然您的shell支持足够的作业控制以具有后台进程的概念,因此可以合理地假设您的实现将具有跟踪后台作业的表。该表可以并且应该跟踪与每个作业相关联的过程的PID。
掌握了这些PID后,您可以waitpid()
查看特定后台作业,直到表格中没有其他作业,或者您可以waitpid(-1)
收集
任何和每个工作,循环,直到表中没有更多的后台工作。
答案 1 :(得分:0)
如果要实现后台进程(和作业控制)并捕获终止(至少),则必须为SIGCHLD
设置信号处理程序,并在其中调用wait(-1)
。这将让您的shell接收后台进程终止的异步通知。例如,您可以查看Catching SIGCHLD并讨论此问题。