【问题标题】:How does epoll know socket is ready in kernel?epoll 如何知道内核中的套接字已准备就绪?
【发布时间】:2016-08-12 03:31:41
【问题描述】:

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

  1. epoll 是否在内核中注册了callback
  2. epool 是否在内核中为read/write 注册了signal
  3. 还是别的什么?

非常感谢。

【问题讨论】:

    标签: linux-kernel epoll


    【解决方案1】:

    简答

    不仅对于epoll,而且通常对于“阻塞I/O”(例如read() 系统调用使用相同的机制),内核使用waitqueues(不要将它们与workqueues 混淆这是完全不同的机制)。如果您检查ep_poll() 的实现,它甚至记录在 cmets 中。

    一些不那么有趣的细节

    为了让当前线程在等待队列上休眠,通常会使用wait_event_interruptible() 调用。但是,epoll_wait 并没有这样做。相反,它通过使用__add_wait_queue_exclusive() 将自己添加到等待队列、使用set_current_state(TASK_INTERRUPTIBLE) 将自己置于睡眠状态并检查循环中被唤醒的原因来重新实现此调用将执行的操作。最终结果是一样的——当前线程将进入可中断睡眠状态,这可以通过发送信号终止(在这种情况下epoll_wait 将返回EINTR)或者当ep_poll_callback 通过waitqueues 机制唤醒时.

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2023-03-11
      • 2019-09-01
      • 1970-01-01
      • 2014-07-02
      • 2019-10-09
      相关资源
      最近更新 更多