当前位置:嗨网首页>书籍在线阅读

21-在信号和文件描述符上等待

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

63.5 在信号和文件描述符上等待

有时候,进程既要在一组文件描述符上等待I/O就绪,也要等待待发送的信号。我们可以尝试通过select()来执行这样的操作,如程序清单63-7所示。

程序清单63-7:非阻塞信号和select()调用的错误用法

1655.png 这段代码的问题在于,如果信号(本例中是SIGUSR1)到来的时机刚好是在安装信号处理例程之后且在select()调用之前,那么select()依然会阻塞。(这是竞态条件的一种形式。)现在我们来看看对于这个问题有什么解决方案。

从2.6.27版内核之后,Linux提供了一种新的技术可同时等待信号和文件描述符状态:这就是本书22.11节中介绍的signalfd。采用这种机制,我们可以通过由select()、poll()或者epoll_wait()所监视的文件描述符(同其他的文件描述符一起)来接收信号。