用于监视子进程的 select() 模拟?

Analog of select() for monitoring child processes?

POSIX 兼容系统中的 select 调用在执行非阻塞 I/O 时很有用,让人们知道文件描述符何时 "ready" I/O 操作。 waitpid 系统调用有什么类似的东西吗?我知道可以使用 WNOHANG 标志使单个 waitpid 调用非阻塞,就像可以使用 MSG_DONTWAIT 标志使单个 recvfrom 套接字调用是非阻塞的。然而,有时 select 提供的超时功能更方便,并且可以尽可能快地避免重复调用 recvfrom 的循环; select 还允许一个人同时监视多个文件描述符。类 Unix 系统(或 Linux 具体)是否提供了类似功能来监视子进程?

我将扩展 Craig Estey 提出的可能性,并将 signalfd 加入其中。

不是设置信号处理程序来处理 SIGCHLD,而是设置 signalfd 来完成这项工作。这样,您将拥有一个文件描述符,当 SIGCHLD 发出信号时,该文件描述符将准备就绪,然后您可以使用 select() 等待它,并超时。

我已经使用 signalfd 作为捕捉信号的方法已有一段时间了。它是 Linux 具体的(根据您附加到问题的标签确定!),并且在执行主线程的上下文中处理信号要容易得多,而不是受限于一个人可以做什么在传统的信号处理程序中执行。对信号的响应时间可能不会那么快,但是如果应用程序已经有反应器,例如 select,或轮询,或 zmq_poll,或者实际上是任何 GUI 框架事件循环的 fd 输入处理程序,这要容易得多。