我有一个问题,我有一个控制可执行文件,监视几个进程,如果有人死了,那么它会重新启动它。 在Windows上,我们使用WaitFOrMultipleObject来处理句柄数组中传递的进程句柄。 如果任何进程死亡,我们得到WaitForMultipleObject确认。
现在我们必须在Linux上实现它。 我们将如何做? 等待只有一个进程ID,而我们必须监视多个进程。
听起来你正在寻找流程组 。 您可以使用waitpid(2)
作为调用中pid的值使用-pidgroup
(即pid组的负值),或者-1
来等待任何子进程。
这是Unix下降的地方之一 – 它确实应该有一个进程的文件描述符的概念,可以传递给select
(这是WaitForMultipleObjects
的Unix等价物)。 但事实并非如此。
你所做的是为SIGCHLD
安装一个处理程序。 在那个处理程序中,你可以在一个循环中调用wait4
或者waitpid
(以较方便的方式,但不要试图用简单的wait
,你需要options参数),直到它返回0为止。其PID和退出状态转换为结构并将该结构写入管道。 在主事件循环中从管道中读取,拉出结构并采取适当的行动。 除非你的程序没有其他的东西要做,而且“主循环”包含在无限循环中调用sigsuspend
,否则不要试图从信号处理程序中重新生成孩子(或者分配内存,或者除了调用waitpid
和write
之外的任何东西 )。