epoll如何知道socket在内核中已准备就绪?

时间:2016-08-12 03:31:42

标签: linux-kernel epoll

我没有在epool源代码中找到有关epoll如何知道套接字为read/write做好准备的提示。

  1. epoll会在内核中注册callback吗?
  2. epool是否在内核中为signal
  3. 注册read/write
  4. 还是其他什么?
  5. 非常感谢。

1 个答案:

答案 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机制。