EPOLLONESHOT是否会阻止单个描述符上的多个事件在一次调用epoll_wait()时被返回?

时间:2015-09-08 18:29:17

标签: linux network-programming epoll

epoll_ctl(2)上的手册页有关于EPOLLONESHOT标志的说法:

Sets the one-shot behavior for the associated file descriptor.
This means that after an event is pulled out with
epoll_wait(2) the associated file descriptor is internally
disabled and no other events will be reported by the epoll
interface.  The user must call epoll_ctl() with EPOLL_CTL_MOD
to rearm the file descriptor with a new event mask.

但是,在插入事件数组后或在返回所有事件之后,是否在epoll_wait中禁用了事件尚不清楚。

1 个答案:

答案 0 :(得分:5)

EPOLLONESHOT的行为是这样的,即在成功调用报告指定文件描述符的epoll_wait(2)之后,epoll_wait(2)将不会在同一文件描述符上报告新事件,直到您使用epoll_ctl(2)明确重新激活它。您可以将其视为在epoll_wait(2)返回文件描述符后临时禁用文件描述符的机制。

它不会阻止epoll_wait(2)在同一个调用中为同一个文件描述符返回多个事件 - 实际上,如果在调用时有多个事件可用,它们都会合并到{ {1}} events字段,无论struct epoll_event是否对该文件描述符有效。

换句话说,EPOLLONESHOT控制在EPOLLONESHOT的调用中,在什么条件下报告文件描述符;它在事件聚合和检测中不起作用。

示例

下面的代码创建了一对连接的套接字并写入一端。 epoll_wait(2)可用于读写。如您所见,添加或删除sv[1]EPOLLONESHOTEPOLLIN合并为一个事件的事实没有影响。

EPOLLOUT