linux epoll网络模型 et模式 EPOLLOUT EPOLLIN 触发条件

ET模式称为边缘触发模式,顾名思义,不到边缘情况,是死都不会触发的。

 

EPOLLOUT事件

epollout事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:
1.某次write,写满了发送缓冲区,返回错误码为eagain。
2.对端读取了一些数据,又重新可写了,此时会触发epollout。
简单地说:epollout事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!

其实,如果你真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含epollout),关键是重新设置,就会马上触发一次epollout事件。

epollout 主要是用来传输大量数据的时候,没有办法一次将数据全部发送出去就需要将剩下的数据缓存起来,等内核通知缓冲区可写的时候再继续发送

epollout 在发送大型文件的时候需要进行处理,通知用户是不是内核的缓冲区可读,举个例子,一次发送10g个文件,但是一次内核缓冲区之中只能存储200个字节的东西,这时候我们就需要注册epollout 事件,如果内核缓冲区可读的话,就通知内核有这个事件,一般是用户来进行注册的函数

在muduo之中,非阻塞编程,如果一次没有发送完毕,然后重新注册可写时间,如果可写,发送剩余的数据

 

EPOLLIN事件

EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。
现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。

 

 

你可能感兴趣的:(linux epoll网络模型 et模式 EPOLLOUT EPOLLIN 触发条件)