et模式下, epollin和epollout触发条件
从别人那里听来的,先记着,实践后再更新
ET是边沿触发, 就像01的电平信号一样, 只有状态发生变化的那一刻,才会触发消息。
例如:缓冲区从空到非空, 从非空到空, 都会触发。
缓冲区从不满,到满, 这时候用非阻塞socket写, 会报错EAGIN, 提示你重试, 如果是阻塞socket, 那就等待,直到缓冲区有空位置.
缓冲区从满,变为不满时, 表示可写了,这是会触发epoll_out事件
缓冲区从不满,到满, 不影响读
缓冲区从空,到不空,表示有数据来了,可以读
缓冲区从不空到空,表示缓冲区的数据都读了, 这是非阻塞socket读,会报EAGIN, 告诉你重试, 如果是阻塞socket就阻塞,等待,直到剩余的数据来了。
(EAGIN和EWOULDBLOCK 是一个东西, 有的平台用EAGIN, 有的平台用EWOULDBLOCK)
默认,连接刚建立时,也会触发一次epoll_out, 网上的解释是 写缓冲区可写, 暂且这么记下来, 我不知道是啥原因。
如果想强制触发,EPOLL_OUT, 只需要使用epoll_ctl更新下 fd绑定的事件, 这样会马上触发, 原因我也不知道,都是网上说的。 这种方式会降低效率,因为增加了一次系统调用。

浙公网安备 33010602011771号