ET模式称为边缘触发模式,顾名思义,不到边缘情况,是死都不会触发的。
EPOLLOUT事件:
EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:
1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。
2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。
简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!
其实,如果你真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。
EPOLLIN事件:
EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。
现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。
分享到:
相关推荐
linux epoll ET和LT触发深入分析,深入剖析epoll触发机制。
举源码实例来说明epoll之LT和ET模式的区别
依赖了boost 库的线程池
epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht
EPOLL的ET和LT模式.doc 网络服务器编程
自己学习并改写的epoll代码,在Linux测试没问题,分别实现了epoll的LT模式和ET模式,初学者可以学一学
用户在调用epoll_wait时,ET模式产生的事件只会报告一次。不管epoll管理的连接有多少,epoll_wait都会在常数时间内返回。而使用LT模式时,epoll_wait会去遍历所有连接的状态,只要某个连接的接收缓冲区中还有数据,...
socket网络编程-epoll-水平触发和边缘触发源码。 (1)I/O多路复用技术用于监控多个TCP连接上的数据收发,而epoll就是一种在Linux上使用的I/O多路复用并支持高并发的典型技术。传统的select、poll也是I/O多路复用...
基于epoll的echo server,用回调函数封装了epoll,以后会添加序列化和粘包处理,以及心跳,慢慢完善。
selet-poll-epoll三种模式的简介与比较
多路IO复用-epoll,通过epoll实现事件通知,实现了水平(阻塞),边缘(非阻塞)触发
FIFO配合管道PIPE,实现FIFO传递数据,PIPE触发epoll,异步IO效果
使用epoll从头开始构建基于事件循环的微小http服务器
EPOLL-linux下select-poll的增强版
ok,err=epoll.register(epfd,fd,eventmask) 把目标文件描述符 fd 注册到由 epfd 引用的 epoll 实例上并把相应的事件 event 与内部的 fd 相链接。ok,err=epoll.modify(epfd,fd,eventmask) 更改目标文件描述...
poll、epoll函数事件标志符值常量 | 说明POLLIN | 普通或优先级带数据可读POLLRDNORM | 普通数据可读POLLRDBAND | 优先级
epoll 的事件模型 实例
1.平触发的阻塞sockfd 2.边缘触发的阻塞sockfd 3.平触发的阻塞connfd 4.平触发的阻塞connfd 5.边缘触发的阻塞connfd 6.边
linux下epoll网络模型介绍 简单讲解如何使用epoll模型, linux下epoll网络模型介绍 简单讲解如何使用epoll模型