首页 > 解决方案 > 用于监视子进程的 select() 的模拟?

问题描述

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

标签: clinuxmultithreadingunixnonblocking

解决方案


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

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

很长一段时间以来,我一直在使用 signalfd 作为捕获信号的一种方式。它是 Linux 特定的(可以通过您附加到问题的标签来确定!),并且在执行主线程的上下文中处理信号要容易得多,而不是受限于在常规线程中可以做什么信号处理程序。对信号的响应时间可能不会那么快,但如果应用程序已经有一个反应器,如 select、poll、zmq_poll,或者任何 GUI 框架的事件循环处理程序的任何 fd 输入,它就会容易得多。


推荐阅读