我有一个问题,我有一个控制可执行文件,监视几个进程,如果有人死了,那么它将重新启动它。在Windows上我们正在使用WaitFOrMultipleObject,其中进程句柄在句柄数组中传递。如果任何进程死掉,我们会被WaitForMultipleObject确认。
现在我们必须在Linux上实现它。我们将如何做到这一点?等待仅适用于一个进程ID,而我们必须监视多个进程。
答案 0 :(得分:1)
听起来像是在寻找process groups。对于使用-pidgroup
的进程组(即pid组的负值),您可以waitpid(2)
作为调用中pid的值,或-1
等待任何子进程。< / p>
答案 1 :(得分:1)
这是Unix崩溃的地方之一 - 它确实应该有一个进程的文件描述符的概念,可以传递给select
(这是与{{1}相当的Unix }});但事实并非如此。
您要做的是为WaitForMultipleObjects
安装处理程序。在该处理程序中,您可以在循环中调用SIGCHLD
或wait4
(以更方便;但不要尝试使用普通waitpid
,您需要使用options参数),设置{ {1}}标志,直到它返回0.对于每个子节点,将其PID和退出状态打包到结构中并将该结构写入管道。从主事件循环中的管道读取,拉出结构并采取适当的措施。除了你的程序没有别的事情要做之外,不要试图从信号处理程序中重新生成子项(或分配内存,或者除了调用wait
和WNOHANG
之外任何)。 “主循环”包括在无限循环中调用waitpid
。