在使用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是独立触发的吗?

解决方案 »

  1.   

    1. EPOLLIN和EPOLLOUT是独立触发的吗?
        No
    2. 建议使用不要使用EPOLLET
      

  2.   

    有什么资料可以说明EPOLLIN和EPOLLOUT不是独立触发的吗?
      

  3.   

    准确的说,说不上独立出发,关键在于边沿触发(Edge-Triggered)和水平触发(Level-Triggered)的不同。
    如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知.
    建议楼主试试水平触发。man epoll 里有关触发(Edge-Triggered)和水平触发(Level-Triggered)的不同,有详细的说明.
      

  4.   

    ET和LT模式区别我知道,但是我的程序出现了这个奇怪的问题。正如我问题上描述的,当我同时mod了IN和OUT事件时,只会收到OUT事件触发通知,IN事件却不会再触发了,确定的是client正在一直发送数据,但是服务器再也没处理IN事件的机会了。目前的解决方案是处理完OUT事件后,再次mod IN事件,这样才会继续recv数据