Linux-网络编程之Epoll_只是个笔记

注意EPOLLOUT和EPOLLIN事件不要同时注册。
如果同时注册,那么当有EPOLLIN事件时也会产生EPOLLOUT事件。

情况一(同时注册 EPOLLIN 和 EPOLLOUT 事件,并且缓冲区是满的): 主要是服务端接收客户端的请求,然后回写大小为 1024000 字节的字符串(客户端并不接收回写数据),一直到把缓冲区撑满了,这时将事件注册为(EPOLLIN | EPOLLOUT),客户端再继续发请求。
可以观察到的结果是,EPOLLIN 事件被触发了,但是 EPOLLOUT 事件并未触发(此时缓冲区仍然是满的状态)。当客户端开始接收数据时,EPOLLOUT 这时被触发(缓冲区数据被读走)。
情况二(同时注册 EPOLLIN 和 EPOLLOUT 事件,缓冲区未满):上面的实验继续,客户端将所有的数据接收到,服务器发送缓冲区为未满状态,但是未移除 EPOLLOUT 事件,客户端在继续发送请求时,会同时触发 EPOLLIN 和 EPOLLOUT 事件!注意这里并不存在(满到未满的变化),只要有 EPOLLIN 的事件就会顺便携带一次 EPOLLOUT 的标志。还会额外触发一次 EPOLLOUT 事件,这样的话就进入两次的 EPOLLOUT 判断中。
也就是这种情况下,会触发两个事件,一个是由描述符可读发生的 EPOLLIN 事件并且该事件也携带了 EPOLLOUT 标志,另一个就是单独携带 EPOLLOUT 标志的可写事件。

你可能感兴趣的:(Linux-网络编程之Epoll_只是个笔记)