SIGIO与epoll适用于Linux套接字

问题描述

Linux(man 7 socket)的套接字文档说,您可以将套接字设置为O_ASYNC,然后在套接字准备好进行读/写操作时接收信号。

但是,似乎大多数人都改为使用epoll。使用epoll而非此异步信令系统的原因是什么?

解决方法

如果您有一个中央循环,可以捕获所有类型的事件,那么编写单个线程的应用程序就非常容易,并且不必担心在执行不同执行时可能发生的所有同步问题上下文。

如果使用信号处理程序,则必须注意不要从信号处理程序上下文调用非可重入函数。您可以拨打Async-signal-safe functions 的清单。如您所见,这是一个简短的清单!结果,您的信号处理程序无法做很多事情,可能只是设置一个标志或发送一条消息,而实际工作必须在“某处”完成。实际上,信号处理程序非常有限。

而且,在多线程应用程序中使用信号处理程序也并不像乍看起来那样容易,因为处理程序是针对每个任务而不是针对每个线程的。了解更多:signal handler function in multithreaded environment