当前位置: 首页 > news >正文

epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现

一、epoll 事件总览(最常用的 10 个)

epoll 返回的 events 是一个 bitmask(位图),可能包含多个事件组合。

下面按使用频率从高到低列出来:

事件名含义是否常见
EPOLLINfd 可读(有数据到达 / 对端关闭)★★★★★
EPOLLOUTfd 可写(发送缓冲区有空位置)★★★★
EPOLLERRsocket 出错(RST 等)★★★★★
EPOLLHUP对端关闭(FIN)★★★★★
EPOLLRDHUP半关闭(对方调用了 shutdown(SHUT_WR))★★★★
EPOLLET边缘触发模式★★★★★(高性能服务器必须用)
EPOLLONESHOT一次性事件,处理完需手动重置★★★★
EPOLLPRI紧急数据(TCP OOB)★★
EPOLLEXCLUSIVE避免惊群(监听 socket 用)★★★
EPOLLWAKEUP系统唤醒(安卓)少见

二、最常见 & 必须处理的事件组合

epoll 最典型的 four events:

EPOLLIN     → 有数据可读
EPOLLOUT    → 可以写数据
EPOLLERR    → 错误,必须关闭
EPOLLHUP    → 对方挂断,必须关闭

大多数情况下会处理的就是这四个。

三、事件组合出现的情况(epoll 特点)

epoll 一次返回的 events 可能包含多个标志位,例如:

1. 正常收发数据:

events = EPOLLIN

2. 写入数据阻塞后,现在可写:

events = EPOLLOUT

3. 对端关闭 + 有未读完的数据:

events = EPOLLIN | EPOLLRDHUP

4. 错误 + 可读(错误最高优先级)

events = EPOLLIN | EPOLLERR

5. 边缘触发写法常见:

events = EPOLLIN | EPOLLOUT | EPOLLET

 四、生产服务器具体会遇到哪些组合?

实际开发中出现频率最高的组合如下:

① 客户端发送数据 → 服务器读事件:

EPOLLIN

② 客户端断开 → 两种情况:

正常断开:

EPOLLHUP | EPOLLIN

异常断开:

EPOLLERR

半关闭(常见于 HTTP/1.1):

EPOLLIN | EPOLLRDHUP

③ 写缓冲区满后又能写了:

EPOLLOUT

④ 边缘触发(ET)+ 写事件:

EPOLLIN | EPOLLET

⑤ epoll 已经出错:

EPOLLERR

这种必须马上 close。

 五、事件含义详细讲解

EPOLLIN(最常见)

  • 套接字可读

  • read() 不会阻塞

  • 包含:对端关闭时 read=0 也会触发 IN

EPOLLOUT

  • 套接字可写

  • send() 不会阻塞

EPOLLERR(非常关键)

  • 底层 TCP 出错(如对方 RST)

  • 必须马上关闭 fd

  • 如果不处理,会造成 CPU 100%

EPOLLHUP(非常关键)

  • 对端关闭(FIN)

  • 必须关闭 fd,不要再读写

EPOLLRDHUP(高质量服务器必须用)

  • 对端半关闭(如 shutdown)

  • HTTP keep-alive 场景很常见

  • 比 EPOLLHUP 更准确

EPOLLET:边缘触发

  • 高性能服务器必用(比如 nginx)

  • 必须一次性读完所有数据,否则不会再触发

EPOLLONESHOT:一次性事件

  • 用于多线程模型,防止多个线程抢同一个 fd

六、一个真实服务器事件判断模板

uint32_t ev = events;// 优先处理错误
if (ev & (EPOLLERR | EPOLLHUP | EPOLLRDHUP)) {closeConn(fd);return;
}// 可读事件
if (ev & EPOLLIN) {handleRead(fd);
}// 可写事件
if (ev & EPOLLOUT) {handleWrite(fd);
}

这就是 nginx、muduo、libevent 的标准写法。

http://www.dtcms.com/a/611090.html

相关文章:

  • 手机网站根目录建设银行登录网站
  • 磁共振成像原理(理论)31:基本梯度回波成像 (Basic Gradient-Echo Imaging)
  • 庐江县住房和城乡建设局网站网站建设的维护范围
  • ASC学习笔记0008:用于注册能力按键输入的回调
  • 邯郸市做网站广西远昌建设公司
  • 网站标题切换无版权的图片素材网站
  • Linux入门---vim编辑器
  • 网站建设服务代理商全面的上海代理注册公司
  • 8.Collections.synchronizedMap 与 ConcurrentMap 的区别与适用场景
  • PHP操作redis
  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
  • 戴尔的网站建设福州网站建设营销方案
  • Redis 面试题精编(70道|含答案|分类整理)
  • 苏州做公司网站设计的公司网站建设项目执行进度表
  • 发布网站域名设置wordpress 搭建 查分系统
  • 四旋翼无人机视觉目标跟踪系统完整实现指南
  • 网站建设与管理案例柳洪轶苏州保洁公司招聘保洁区域经理
  • 中国核工业华兴建设有限公司网站c蔡甸区城乡建设局网站
  • 如何使用C语言反编译程序 | 反编译技术和注意事项
  • 免费设计签名在线生成网络推广seo怎么弄
  • 威海住房和城乡建设厅网站新国标小区网络建设
  • 河北建设厅官方网站聊城网站建设工作室
  • AURIX与tasking改变字体大小
  • MySQL 条件唯一索引实战:用 delete_time 实现活跃记录唯一
  • ⭐ TIE Cell(Tie-High / Tie-Low)完整技术总结与工程指导
  • 淘宝网站c 设计怎么做wordpress屏蔽右键
  • 苏州网站制作公司合肥建设网
  • 简化接口测试:利用Dify工作流结合CI/CD,实现一键式回归验证
  • 网站建设宣传方案三更app下载网站
  • 济宁祥云网站建设深圳龙华是低风险区吗