我有一些关于epoll
的问题:
因为即使使用边缘触发的epoll,也可以有多个事件 在收到多个数据块时生成,调用者具有 选项指定EPOLLONESHOT标志,告诉epoll 收到事件后禁用关联的文件描述符 与epoll_wait(2)。指定EPOLLONESHOT标志时,它是 调用者有责任使用重启文件描述符 epoll_ctl(2)与EPOLL_CTL_MOD。
如果在EPOLLONESHOT
之前我没有使用read
和EAGAIN
,我会丢失数据吗?我查看了Libevent
的源代码,但他们没有使用EPOLLONESHOT
。
答案 0 :(得分:1)
如果您不使用EPOLLONESHOT
,并且在获得EAGAIN
之前始终阅读,则没有理由(除了代码中的错误),为什么您应该错过任何传入的数据。在这种情况下,如果使用电平触发或边沿触发,则无关紧要。因此,在获得EAGAIN
之前始终阅读是最安全的。
如果您使用EPOLLONESHOT
,还需要确保重新安装文件描述符。在大多数情况下,这是不必要的复杂性,所以如果你不知道为什么需要它,你就不需要它。
您的第二个问题与epoll
没有直接关系。用于检测请求的开始,结束和完整性的方法取决于您使用的协议。在您的请求中某处有长度可能是其中一个选项。