如何监控过程生命

我有一个问题,我有一个控制可执行文件,监视几个进程,如果有人死了,那么它会重新启动它。 在Windows上,我们使用WaitFOrMultipleObject来处理句柄数组中传递的进程句柄。 如果任何进程死亡,我们得到WaitForMultipleObject确认。

现在我们必须在Linux上实现它。 我们将如何做? 等待只有一个进程ID,而我们必须监视多个进程。

听起来你正在寻找流程组 。 您可以使用waitpid(2)作为调用中pid的值使用-pidgroup (即pid组的负值),或者-1来等待任何子进程。

这是Unix下降的地方之一 – 它确实应该有一个进程的文件描述符的概念,可以传递给select (这是WaitForMultipleObjects的Unix等价物)。 但事实并非如此。

你所做的是为SIGCHLD安装一个处理程序。 在那个处理程序中,你可以在一个循环中调用wait4或者waitpid (以较方便的方式,但不要试图用简单的wait ,你需要options参数),直到它返回0为止。其PID和退出状态转换为结构并将该结构写入管道。 在主事件循环中从管道中读取,拉出结构并采取适当的行动。 除非你的程序没有其他的东西要做,而且“主循环”包含在无限循环中调用sigsuspend ,否则不要试图从信号处理程序中重新生成孩子(或者分配内存,或者除了调用waitpidwrite之外的任何东西 )。