【问题标题】:Does epoll_wait() return events one at a time?epoll_wait() 是否一次返回一个事件?
【发布时间】:2022-01-12 21:26:02
【问题描述】:

假设我添加了一个 epoll 套接字,同时等待 EPOLLIN 和 EPOLLOUT 事件,如下所示:

struct epoll_event event;
event.events = EPOLLIN | EPOLLOUT;
epoll_ctl(epfd, EPOLL_CTL_ADD, socket, &event);

如果套接字变得可读可写,我是否需要调用epoll_wait() 两次来接收这两个事件,还是返回一个设置了两个位域的epoll_event? (假设 epoll_wait() 以 1 的 maxevents 调用。)

【问题讨论】:

  • 您是否考虑过为epoll_wait() 阅读the documentation?如果您不理解文档,我们可以澄清,但在这种情况下,请指出您不理解的部分。
  • 当我问这个问题时,我已经阅读了手册页,但不确定多个事件是作为多个结构返回还是作为一个 epoll_event 中的多个事件返回。

标签: c sockets asynchronous epoll


【解决方案1】:

epoll_wait() 的文档说:

events 字段是一个位掩码,指示发生的事件 已发生对应的打开文件描述。

复数“事件”表示同一个描述符可以发生多个事件。

我相信epoll_wait()maxevents 参数实际上指定了events 数组中的最大元素——如果单个FD 有多个事件发生,它们都在一个元素中。

请注意,如果您使用级别触发事件(默认),EPOLLOUT 几乎总是会立即触发,因为套接字始终准备好写入,除非您写入的内容太多以至于填满了内核的套接字缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2013-12-11
    • 2015-12-04
    • 2013-08-12
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多