epoll_wait() return 一次发生一个事件吗?

Does epoll_wait() return events one at a time?

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

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

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

epoll_wait() 的文档说:

The events field is a bit mask that indicates the events that have occurred for the corresponding open file description.

复数形式的“事件”意味着同一描述符可以发生多个事件。

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

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