是否可以在一次触发模式下使用epoll?
我在搜索时找不到任何信息,似乎每个人都使用边缘触发模式。
发布于 2017-09-10 16:31:20
如果选择了EPOLLONESHOT标志,并且您已经为套接字提取了一个事件,那么套接字不会像许多人想的那样从epoll中被删除,但是它的事件会被禁用。您可以使用epoll_ctl / EPOLL_CTL_MOD再次启用它们。
当您将可用的数据从套接字读取到缓冲区时,EPOLLONESHOT行为就很方便了。该缓冲区将被独立地清空,但是除非它不是空的,否则您必须禁用套接字事件,即使套接字有额外的数据。然后,在缓冲区被使用和清空后,您可以重新启用套接字。
边缘和水平触发的“一击”行为之间的区别只有在重新启用套接字时才会出现。举个例子:
epoll_ctl / EPOLL_CTL_MOD重新启用套接字。级-触发EPOLLONESHOT:
边缘触发EPOLLONESHOT:
EAGAIN / EWOULDBLOCK来测试它。发布于 2017-01-29 02:04:21
如果希望epoll停止监听套接字,则应该使用EPOLLONESHOT。如果确实使用EPOLLONESHOT,则必须在该套接字上的epoll信号之后将套接字添加回epoll。因此,EPOLLONESHOT不是EPOLLET。您可以在没有EPOLLET的情况下使用EPOLLONESHOT,但是它可能没有效率。如果使用这两个标志,则必须使用非阻塞套接字,并且只向epoll添加一个套接字一次recv,并发送带有EAGAIN错误的返回。详情请参阅手册页。
https://stackoverflow.com/questions/39173429
复制相似问题