我没有在epool
源代码中找到有关epoll如何知道套接字为read/write
做好准备的提示。
callback
吗? signal
?read/write
非常感谢。
答案 0 :(得分:1)
不仅对epoll
而且对于“阻塞I / O”(例如,read()
系统调用使用相同的机制),内核使用waitqueues
(不要将它们与workqueues
混淆,这是完全不同的机制)。如果您检查ep_poll()
实施,它甚至会在评论中记录。
为了让当前线程在waitqueue上休眠,通常会使用wait_event_interruptible()
调用。但是,epoll_wait
不会这样做。相反,它通过将自己添加到具有__add_wait_queue_exclusive()
的waitqueue来重新实现此调用将执行的操作,使自己与set_current_state(TASK_INTERRUPTIBLE)
一起休眠,并检查在循环中被唤醒的原因是什么。最终结果是相同的 - 当前线程将被置于可中断睡眠状态,可以通过发送信号(在这种情况下epoll_wait
将返回EINTR
)或在ep_poll_callback
唤醒时终止通过waitqueues
机制。