Process 等待所有后台作业终止,C

Process 等待所有后台作业终止,C,process,fork,wait,pid,Process,Fork,Wait,Pid,我知道waitpid(-1…)如何允许我等待所有子项完成,例如waitpid(-1,&status)。但是,我如何才能等到所有后台过程完成?有人建议我可以使用相同的waitpid(在循环中?)来实现这一点,但我不知道如何实现 为了清楚起见,我正在实现一个shell,并且需要添加一个新的内置命令wait,该命令将等待所有后台作业终止,然后返回提示符 我在上的其他地方读到,“您还需要定期使用WNOHANG选项调用waitpid(),比如,在显示shell提示符之前。这将允许您检测后台进程何时退出或停

我知道waitpid(-1…)如何允许我等待所有子项完成,例如waitpid(-1,&status)。但是,我如何才能等到所有后台过程完成?有人建议我可以使用相同的waitpid(在循环中?)来实现这一点,但我不知道如何实现

为了清楚起见,我正在实现一个shell,并且需要添加一个新的内置命令wait,该命令将等待所有后台作业终止,然后返回提示符

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


编辑:

我最终只是做了while(wait(NULL)>0);就这样,成功了。但我仍然感到困惑的是,我不想区分前台和后台,因为我正在实现的等待只等待后台进程,在wait()或waitpid()看来,所有子进程都是平等的


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

如果您想实现后台进程(和作业控制)并捕获它们的终止(至少),您必须为
SIGCHLD
设置一个信号处理程序,并在其中调用
wait(-1)
。这将允许shell接收后台进程终止的异步通知。您可以看一看示例,并就此进行讨论。

因为您在实现shell的上下文中提出了问题,而且显然您的shell支持足够的作业控制,因此有必要假设您的实现将有一个跟踪后台作业的表。该表可以并且应该跟踪与每个作业关联的流程的PID

有了这些PID,您可以对特定的后台作业执行
waitpid()
,直到表中没有更多的PID,或者您可以
waitpid(-1)
进行收集
循环中的所有作业,直到表中不再有后台作业。

C没有“后台进程”的概念。背景和前景是一个shell作业控制的东西。那么你的意思是什么呢?我正在实现一个shell,所以你完全正确。你能详细介绍一下waitpid(-1)循环吗?我想您是指带有WNOHANG选项的waitpid(-1)。@ajfbiw.s,这取决于您想要的语义。您的问题要求等待所有后台作业完成,这意味着要进行阻止,即不要使用
WNOHANG
。事实上,如果每个跳出循环的路径都要求您收集至少一个孩子,那么使用
WNOHANG
是没有意义的;就这样,成功了。但我仍然感到困惑的是,我不想区分前台和后台,因为我正在实现的等待只等待后台进程,而所有子进程在wait()或waitpid()眼中都是平等的。所以,我再次使用wait()或waitpid()来等待子进程不一定是后台进程。我错了吗?@ajfbiw.s,正如我之前写的,前景和背景是shell强加的区别
wait()
waitpid()
对此没有概念。但是,请注意,当shell本身位于前台时,其所有托管作业都必须位于后台。如果您只需要在这种情况下执行此任务,那么等待所有子进程可能就可以了。