2017-05-31 92 views
0

我有一个使用select,epoll或kevent(平台依赖,OSX,Linux和FreeBSD)的中央事件机制的程序。Linux:等待PID死亡

现在我有一个问题,我需要等待一个进程完成执行。我从这个过程中得到的只是它的PID。有没有办法等待PID完成上述机制?

我目前的想法是为PID创建一个管道,并使用信号为kill的轮询PID检查它是否存在。如果没有,写一个字节到管道来唤醒轮询机制。但我不喜欢这个问题需要额外的线程的想法。

感谢每一个答案!

+1

你可以使用''waitpid''(''man 2 wait'')进入休眠状态,直到进程结束。 – nefas

+0

但我希望程序的其余部分能够运行。另外我不会只等待1个pid,而是多个。这就是为什么我想用我的投票机制。 – Nidhoegger

+0

您可以按流程制作管道,并在流程结束时将其推入。在“主”过程中,您可以在管道上“选择”。一旦过程完成,它会在管道中写入。 “select”停止等待(因为管道中有东西需要读取)。 – nefas

回答

1

我建议您在执行结束时使用waitpid。您可以在程序结束时等待多个pid。只需将您的pid存储在pid_t *中,并等待所有这些(一个接一个)。你的主要过程将等待所有他的孩子,所以你将不会有任何僵尸

0

为SIGCHLD注册一个处理程序(空的,你只是想让信号中断你的调用select()或者其他你通常使用的函数等待),然后检查等待函数是否返回EINTR。如果是这样 - 它被一个信号打断;用WNOHANG调用wait4()来检查你的孩子的状态。