c - 用于监视子进程的 select() 的模拟?
问题描述
POSIX 兼容系统中的select
调用在执行非阻塞 I/O 时很有用,让人们知道文件描述符何时“准备好”进行 I/O 操作。waitpid
系统调用有什么类似的吗?我知道可以使用WNOHANG
标志使单个waitpid
调用非阻塞,就像可以使用MSG_DONTWAIT
标志使单个recvfrom
套接字调用非阻塞一样。但是,有时 提供的超时功能更方便,并且可以让我们尽可能快地select
避免重复调用的循环;recvfrom
select
还允许同时监视多个文件描述符。类 Unix 系统(或特别是 Linux)是否提供了类似的功能来监视子进程?
解决方案
我将扩展 Craig Estey 建议的可能性,并将 signalfd 加入其中。
不要设置信号处理程序来处理 SIGCHLD,而是设置 signalfd 来完成这项工作。这样,当 SIGCHLD 发出信号时,您将拥有一个准备就绪的文件描述符,然后您可以使用 select() 等待它,并超时。
很长一段时间以来,我一直在使用 signalfd 作为捕获信号的一种方式。它是 Linux 特定的(可以通过您附加到问题的标签来确定!),并且在执行主线程的上下文中处理信号要容易得多,而不是受限于在常规线程中可以做什么信号处理程序。对信号的响应时间可能不会那么快,但如果应用程序已经有一个反应器,如 select、poll、zmq_poll,或者任何 GUI 框架的事件循环处理程序的任何 fd 输入,它就会容易得多。
推荐阅读
- javascript - 用于停止浏览器页面脚本的 Javascript 功能,在 for 循环中,然后继续,不会使浏览器过载?
- angular - angular 6 build chunks 名称很奇怪而且大小很大
- python - 在python 3.4的全局部分调用main函数中的函数
- c - C中字符串数组的增加值
- python - Pandas - 查找 2 个相关属性的最大计数并用该值替换重复行
- python - 来自底层脚本的数据框未更新
- javascript - 隐藏 div 仅适用于第一个 if 语句
- angular - ASP.Net Core 2.1 Angular SSR/Universal 返回 Http 状态代码 404
- javascript - Rails form_with ajax回调不起作用
- parsing - 如何使用 IIB 解析 YAML 模型?