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() 是不是一次返回一个事件?的主要内容,如果未能解决你的问题,请参考以下文章