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
中禁用了事件尚不清楚。
答案 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]
对EPOLLONESHOT
和EPOLLIN
合并为一个事件的事实没有影响。
EPOLLOUT