非阻塞等待子进程退出

Posted

技术标签:

【中文标题】非阻塞等待子进程退出【英文标题】:Non blocking wait for child processes to exit 【发布时间】:2014-03-28 19:48:38 【问题描述】:

我有一个 C 语言程序,它使用 fork() 启动 100 个子进程,然后使用循环中的等待等待它们完成。我想等待最长时间让它们全部完成,因此如果其中一个被阻塞,父进程不会保持阻塞状态,如果该时间结束,则杀死未完成的进程。

最好的方法是什么?

【问题讨论】:

【参考方案1】:

设置所需时间的闹钟。如果警报响起,请杀死您最初的孩子名单中尚未死亡的孩子,并向他们发送适当的“走开”信号。

我建议先发送 SIGTERM 或 SIGHUP;然后收集尸体。如果在另一个短暂的延迟之后还有剩余,则发送 SIGKILL 信号。如果你过快地太戏剧化(SIGKILL),程序就没有机会清理它们造成的任何混乱。

【讨论】:

【参考方案2】:

子进程需要以某种方式向主进程发出信号,表明它们已完成(您可以让它们将消息传递回主进程,让它们创建一个说明它们已完成的文件,或任何其他方式对你来说最简单)。一旦该机制到位,让主进程检查进程已完成的信号,如果它已收到所有进程则继续,否则在再次检查之前等待一段时间。在此循环中添加一个检查以查看是否已达到最大超时,如果已达到,则继续。

【讨论】:

以上是关于非阻塞等待子进程退出的主要内容,如果未能解决你的问题,请参考以下文章

编写多进程编程

Linux-进程控制

Linux进程控制

Linux进程控制

Linux进程控制

Linux进程控制(精讲)