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

Wait until all background jobs have terminated, C

我知道 waitpid(-1...) 如何让我等到所有 children 都完成,例如 waitpid(-1, &status)。但是我怎么能等到所有 background 进程都完成呢?有人建议我可以使用相同的 waitpid(在循环中?)来实现这一点,但我不知道该怎么做。

明确地说,我正在实施 shell,并且需要添加一个新的 built-in 命令等待,它会等待所有后台作业终止,然后再返回到提示符。

我在其他地方读到 "You will also want to call waitpid() with the WNOHANG option regularly - say, immediately before you display the shell prompt. This will allow you to detect when the background process has exited or stopped " 但是,child != 背景。所以连我都不相信。


编辑:

我最后只是做了 while(wait(NULL) > 0);就是这样,它奏效了。但我仍然感到困惑的是,我不想区分前台和后台,因为我正在实施的等待只等待后台进程,所有 children 在wait() 或 waitpid()。

因此,我再次使用 wait() 或 waitpid() 等待的 children 不一定是后台进程。我错了吗?

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

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

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

中不再有后台作业