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
几乎总是会立即触发,因为套接字始终准备好写入,除非您写入太多以至于填满了内核的套接字缓冲区。
假设我添加了一个 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
几乎总是会立即触发,因为套接字始终准备好写入,除非您写入太多以至于填满了内核的套接字缓冲区。