et模式下, epollin和epollout触发条件

从别人那里听来的,先记着,实践后再更新

ET是边沿触发, 就像01的电平信号一样, 只有状态发生变化的那一刻,才会触发消息。

例如:缓冲区从空到非空, 从非空到空, 都会触发。

缓冲区从不满,到满, 这时候用非阻塞socket写, 会报错EAGIN, 提示你重试, 如果是阻塞socket, 那就等待,直到缓冲区有空位置.

缓冲区从满,变为不满时, 表示可写了,这是会触发epoll_out事件

缓冲区从不满,到满, 不影响读

缓冲区从空,到不空,表示有数据来了,可以读

缓冲区从不空到空,表示缓冲区的数据都读了, 这是非阻塞socket读,会报EAGIN, 告诉你重试, 如果是阻塞socket就阻塞,等待,直到剩余的数据来了。

(EAGIN和EWOULDBLOCK 是一个东西, 有的平台用EAGIN, 有的平台用EWOULDBLOCK)

 

默认,连接刚建立时,也会触发一次epoll_out, 网上的解释是  写缓冲区可写, 暂且这么记下来, 我不知道是啥原因。 

如果想强制触发,EPOLL_OUT, 只需要使用epoll_ctl更新下 fd绑定的事件,  这样会马上触发, 原因我也不知道,都是网上说的。  这种方式会降低效率,因为增加了一次系统调用。

posted @ 2015-11-10 16:32  JinleiZhang  阅读(1534)  评论(0)    收藏  举报