epoll中同时注册EPOLLIN|EPOLLOUT事件奇怪现象?

小竹z 2017-11-01 11:16:18
在使用epoll时,有时候send产生了eagain,此时需要注册out事件,为了能继续recv数据,也把in事件一起带上,代码为epoll_wait(fd,EPOLL_CTL_MOD,EPOLLIN|EPOLLOUT|EPOLLET|EPOLLONESHOT);在epoll_wait时,处理完out事件后,我发现in事件再也不会通知了,仿佛in事件和out事件变成了一体,只要out事件触发了,in事件也一起从epoll删除了。需要再次注册in,就正常的recv了
我在et模式并且使用oneshot方式时,EPOLLIN和EPOLLOUT是独立触发的吗?
...全文
828 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小竹z 2017-11-06
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
准确的说,说不上独立出发,关键在于边沿触发(Edge-Triggered)和水平触发(Level-Triggered)的不同。 如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知. 建议楼主试试水平触发。 man epoll 里有关触发(Edge-Triggered)和水平触发(Level-Triggered)的不同,有详细的说明.
ET和LT模式区别我知道,但是我的程序出现了这个奇怪的问题。正如我问题上描述的,当我同时mod了IN和OUT事件时,只会收到OUT事件触发通知,IN事件却不会再触发了,确定的是client正在一直发送数据,但是服务器再也没处理IN事件的机会了。目前的解决方案是处理完OUT事件后,再次mod IN事件,这样才会继续recv数据
mymtom 2017-11-06
  • 打赏
  • 举报
回复
准确的说,说不上独立出发,关键在于边沿触发(Edge-Triggered)和水平触发(Level-Triggered)的不同。 如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知. 建议楼主试试水平触发。 man epoll 里有关触发(Edge-Triggered)和水平触发(Level-Triggered)的不同,有详细的说明.
mymtom 2017-11-03
  • 打赏
  • 举报
回复
1. EPOLLIN和EPOLLOUT是独立触发的吗? No 2. 建议使用不要使用EPOLLET
小竹z 2017-11-03
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
1. EPOLLIN和EPOLLOUT是独立触发的吗? No 2. 建议使用不要使用EPOLLET
有什么资料可以说明EPOLLIN和EPOLLOUT不是独立触发的吗?

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧