关于EPOLL触发的事件说明

天翼云开发者社区
• 阅读 14

本文分享自天翼云开发者社区《关于EPOLL触发的事件说明》.作者:郑****颖

POLLIN -- 接收缓冲区可读, 对端断开及tcp连接也属于可读。 LT模式下:接收缓冲区可读就会触发;ET模式:状态改变了,比如接收缓冲区从空 ->不空,才会触发一次读。

EPOLLOUT -- 发送缓冲区可写, LT模式:下只要可写就会一直触发。ET模式:默认连接刚建立时也会触发一次OUT,后续发送缓冲区从满 ->不满,会触发一次OUT。

EPOLLRDHUP: Linux 2.6.17 单端断开会收到这个事件及IN(对应FIN包),两种处理方式,直接RDHUP即可,或者IN之后read size为0;

EPOLLHUP: 监听一个不可能发送该事件时,上报,例如一个socket未listen,监听IN就会报这个错误

EPOLLERR:fd已经关闭,继续ADD IN或者OUT事件,报错ERR

EPOLLPRI 接收到send 带的flag为MSG_OOB标志的数据。

EPOLLONESHOT(linux 2.6.2) 这个选项用的比较少,作用是当关心的fd上产生事件时,epoll将会停止关注和上报fd后续的事件,我们需要在处理完事件后再调用epoll_ctl重新安装关心的事件。我能想到这个选项的作用可能是在使用ET模式时提高效率,比如我们在读数据时,又有新数据到来,可以一直读取完而不用再产生和关注新事件。

POLLWAKEUP(linux 3.5) 这个选项很罕见,简单介绍下。当linux运行于autosleep模式时,当有事件产生时将设备从sleep状态唤醒,设备驱动在事件入队之后就继续sleep.如果要让设备等事件处理后再进行sleep状态就要设备此标志。

EPOLLEXCLUSIVE(linux 4.5) 设置独占唤醒模式。这个标志主要用在我们用多个epoll监听同一个fd时,保证当事件到来时只唤醒其中一个epoll.这个标志默认不会设置,因此会有“惊群效应” 如果多个epoll监听同一个fd,部分设置了此选项,部分没有设置此选项。那么到事件到来时,所有未设置此选项的epoll都会唤醒,设置此选项的至少唤醒一个。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
javaNIO编程
UnblockingIO(NewIO):同步非阻塞的编程方式NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题,NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。也就是说,这个时候,已经不是一个连接就要对应
Wesley13 Wesley13
4年前
java实现23种设计模式之责任链模式
顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。pa
Wesley13 Wesley13
4年前
java nio 源码分析2 IO
目的一直想知道当channel.write返回时,到底这个数据是交给操作系统了,还是说已经发出网卡了,还是说已经发出去收到ACK了.(答案:只是说明它写入了内核的send\_queue)javanio是水平触发的,而且缓冲区超过"低水位"就触发读事件,不超过"高水位"就触发写事件,那这个水位到底多高?缓冲
Peter20 Peter20
4年前
redis的三种集群方式
redis有三种集群方式:主从复制,哨兵模式和集群。1.主从复制主从复制原理:从服务器连接主服务器,发送SYNC命令;主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;从服务器收到
Wesley13 Wesley13
4年前
udp之关于linux udp收发包缓冲区大小
1、修订单个socket的缓冲区大小:通过setsockopt使用SO\_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem\_max进行对比校验,但是如果设置的大小超过rmem\_max的话,则超过rmem\_max的部分不会生效;2、修订linux系统udp缓冲区大小:通过rmem\_max来设置系统中udp缓存的上限,该值可通过如下方
Easter79 Easter79
4年前
Swing自定义事件
1.Swing自定义事件将一个组件的事件传递给另一个组件.使用EventListenerList来管理事件,当A组件触发事件的时候,调用方法fireActionPerformed()来触发事件,然后再B组件中actionPerformed()方法来接收事件.当在容器KeyTextComponent中按下鼠标,我们就可以在Jframe中捕获触发的事
Wesley13 Wesley13
4年前
Java设计模式之责任链模式
引入责任链模式责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会
Wesley13 Wesley13
4年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Stella981 Stella981
4年前
JavaScript 事件不触发
在class上绑定的事件,点击图片的时候无法触发<divid"files"class"files"<div<p<canvaswidth"80"height"80"</canvas<br<spanclass
飞码LowCode前端技术系列(二):如何便捷配置出页面 | 京东云技术团队
一、配置解法中飞码提出了至少需要满足2个大能力点以及对应16个细化点。在业务复杂的场景下数据具有流转性质,事件的触发会改变数据、同时也会触发其他事件等情况。飞码使用数据驱动事件驱动的模式解决数据流转性与事件不确定性问题。数据驱动事件驱动的模式决定了需要
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
976
粉丝
16
获赞
40