我没有在epool
源代码中找到任何关于epoll如何知道套接字为read/write
准备好的提示。
- epoll是否在内核中注册了
callback
? - 是否为
read/write
在内核中注册了signal
? 还是别的什么?
简短回答
不仅对于epoll
,而且通常对于"阻塞I/O"(例如,read()
系统调用使用相同的机制),内核使用waitqueues
(不要将它们与workqueues
混淆,这是完全不同的机制)。如果你检查ep_poll()
的实现,它甚至被记录在注释中。
一些不太有趣的细节
为了让当前线程在等待队列上进入睡眠状态,通常会使用wait_event_interruptible()
调用。然而,epoll_wait
没有这样做。相反,它通过使用__add_wait_queue_exclusive()
将自己添加到等待队列中,使用set_current_state(TASK_INTERRUPTIBLE)
将自己置于睡眠状态,并检查在循环中被唤醒的原因,从而重新实现了该调用将要做的事情。最终结果是相同的-当前线程将被置于可中断的睡眠状态,可以通过发送信号(在这种情况下epoll_wait
将返回EINTR
)或通过waitqueues
机制被ep_poll_callback
唤醒来终止。