用于监视子进程的 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 输入处理程序,这要容易得多。
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 输入处理程序,这要容易得多。