我的 shell 中安装了 SIGCHILD 处理程序。假设我正在使用 waitpid 来等待前台进程终止,以便我可以获取它。
据我所知,waitpid 会挂起当前进程并等待给定进程终止,是吗?
如果当我的 shell 等待前台进程时其中一个后台进程终止怎么办?我的 shell 何时会获取已终止的后台进程?如何确保后台进程立即被收获?
最佳答案
只需让您的父 shell 循环等待任何死亡的子进程,当 waitpid()
返回时,您就可以分析该子进程死亡后要做什么。
int status;
int corpse;
while ((corpse = waitpid(-1, &status, 0)) != -1)
{
…perform post-mortem actions…
}
- 如果前台进程终止(已完成),您将继续提示输入下一个命令。
- 如果后台进程终止,您会注意到它已经消失,也许会记录其状态,然后返回到另一个循环周期。
当前台进程退出时,您将在发出下一个提示之前报告所有已死亡的子进程。
由于 -1
值,您永远不应该退出该循环。
关于c - 在运行前台进程时等待后台进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33453114/