本文共 654 字,大约阅读时间需要 2 分钟。
ET模式下,EPOLLOUT触发条件有:
1.缓冲区满-->缓冲区非满;
2.同时监听EPOLLOUT和EPOLLIN事件 时,当有IN 事件发生,都会顺带一个OUT事件;
3.一个客户端connect过来,accept成功后会触发一次OUT事件。
其中2最令人费解,内核代码这块有注释,说是一般有IN 时候都能OUT,就顺带一个,多给了个事件。。
以上,当只监听IN事件,读完数据后改为监听OUT事件,有时候会发现触发OUT事件并不方便,想要强制触发,可以重新设置一次要监听的events,带上EPOLLOUT即可。
另:
一道腾讯后台开发的面试题
使用Linux epoll模型,水平触发模式;当socket可写时,会不停的触发socket可写的事件,如何处理?
第一种最普遍的方式:
需要向socket写数据的时候才把socket加入epoll,等待可写事件。
接受到可写事件后,调用write或者send发送数据。
当所有数据都写完后,把socket移出epoll。
这种方式的缺点是,即使发送很少的数据,也要把socket加入epoll,写完后在移出epoll,有一定操作代价。
一种改进的方式:
开始不把socket加入epoll,需要向socket写数据的时候,直接调用write或者send发送数据。如果返回EAGAIN,把socket加入epoll,在epoll的驱动下写数据,全部数据发送完毕后,再移出epoll。
这种方式的优点是:数据不多的时候可以避免epoll的事件处理,提高效率。
转载地址:http://mysoi.baihongyu.com/