epoll_wait() 是不是一次返回一个事件?

Posted

技术标签:

【中文标题】epoll_wait() 是不是一次返回一个事件?【英文标题】: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 中的多个事件返回。 【参考方案1】:

epoll_wait() 的文档说:

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

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

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

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

【讨论】:

以上是关于epoll_wait() 是不是一次返回一个事件?的主要内容,如果未能解决你的问题,请参考以下文章

epoll_wait惊群问题

epoll_wait会被系统中断唤醒

nginx接受请求连接事件模块流程

LTET模式

UDT中epoll对CLOSE状态的处理

UDT中epoll对CLOSE状态的处理