等到所有后台作业都终止,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.
中不再有后台作业
我知道 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.