EPOLL 事件之 EPOLLRDHUP
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。
对这个现象深入分析后发现,这是一个基于 epoll 的连接池实现上的问题,或者说是特性 :)
首先解释一下导致这个现象的原因。
在使用 epoll 时,对端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件。在低于 2.6.17 版本的内核中,这个 epoll 事件一般是 EPOLLIN,即 0x1,代表连接可读。
连接池检测到某个连接发生 EPOLLIN 事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样一来,上层尝试在对端已经 close() 的连接上读取请求,只能读到 EOF,会认为发生异常,报告一个错误。
因此在使用 2.6.17 之前版本内核的系统中,我们无法依赖封装 epoll 的底层连接库来实现对对端关闭连接事件的检测,只能通过上层读取数据时进行区分处理。
不过,2.6.17 版本内核中增加了 EPOLLRDHUP 事件,代表对端断开连接,关于添加这个事件的理由可以参见 “[Patch][RFC] epoll and half closed TCP connections”。
在使用 2.6.17 之后版本内核的服务器系统中,对端连接断开触发的 epoll 事件会包含 EPOLLIN | EPOLLRDHUP,即 0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层。
重现这个现象的方法很简单,首先 telnet 到 server,然后什么都不做直接退出,查看在不同系统中触发的事件码。
注意,在使用 2.6.17 之前版本内核的系统中,sys/epoll.h 的 EPOLL_EVENTS 枚举类型中是没有 EPOLLRDHUP 事件的,所以带 EPOLLRDHUP 的程序无法编译通过。
转载于:https://blog.51cto.com/no001/1314657
EPOLL 事件之 EPOLLRDHUP相关推荐
- EPOLL事件之EPOLLRDHUP
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开连接,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题. 对这个现象深入分析后发现,这是一个基于epoll的 ...
- 【Nginx】epoll事件驱动模块
Linux 2.4之前的内核版本号,Nginx事件驱动的方法是使用poll.select功能.过程必须等待一个事件发生在连接上(接收数据)时间,部连接都告诉内核,由内核找出哪些连接上有事件发生.因为须 ...
- linux epoll事件模型详解
一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...
- 简约而不简单epoll之EPOLLRDHUP
上一篇主要介绍EPOLLOUT,本篇介绍EPOLLRDHUP.在内核2.6.17(不含)以前版本,要想知道对端是否关闭socket,上层应用只能通过调用recv来进行判断,在2.6.17以后,这种场景 ...
- 利用epoll写一个迷你的网络事件库
epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...
- select事件有哪些_Android 深入底层:Linux事件管理机制 epoll
在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在linux新的内核中,有了一种替换它的机制,就是epoll. sele ...
- epoll边缘触发_epoll事件通知机制详解,水平触发和边沿触发的区别
看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题.不去更深入的了解,只能停留在知其然而不知其所以然.于是,把epoll手册翻译一遍,更深入理解和掌握epoll事件处理相关知识 ...
- epoll EPOLLOUT事件未触发
记录一次epoll事件未触发的经历,由于是tcp通信,使用了io多路复用epoll,客户端只发送数据,不处理服务端响应,服务端处理对应的事件,并且会响应消息给客户端,遇到了EPOLLOUT事件未触发的 ...
- Linux编程入门三网络编程三 epoll的LT和ET模式以及EPOLLONESHOT事件
epoll对文件描述符的操作有两种模式:LT(Level Trigger 电平触发)模式和ET(Edge Trigger 边沿触发)模式. LT是默认的工作模式,这种模式下epoll相当于一个效率较高 ...
最新文章
- 计算机包括桌面计算机和便携式计算机,()计算机包括桌面计算机和便携式计算机这两种形式...
- python底层源码_Python每天一分钟:解析python底层类的实现原理——竟然是type()
- 分布式认证需求-统一认证授权
- 【全0、全1的地址干嘛用的】几类特殊的IP地址,网络号全0,主机号全1等
- JsonRequestBehavior.AllowGet 方便浏览器调试
- 用Flask开发Web版日历应用
- Kali Linux 无线渗透测试入门指南 第六章 攻击客户端
- java实现线性回归(简单明了,适合理解)
- linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】
- 浅谈Visual Studio 2010并行运算原理
- React五——React-router
- php从入门到精通分享,PHP从入门到精通学习路线图分享
- R:导入其他样式数据的方法
- 大黄,今年实在太难了!
- PTES标准中的渗透测试阶段
- grok java_Java Grok.match方法代码示例
- 由LHS和RHS深入理解javascript引擎与作用域的交互
- l那是计算机房吗,机房设计常用计算公式
- cordova 调起拨打电话
- JavaScript今日所学 数组
热门文章
- poll函数_I/O--多路复用的三种机制Select,Poll和Epoll对比
- C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
- 论文笔记之:Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic
- 中国火电设备市场发展方向与投资策略研究报告2022版
- java邮箱找回密码_Spring实现简单的邮箱找回密码功能
- android 数组赋值字符串_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...
- 廊田镇楼下村定点帮扶-农业大健康·李喜贵:功能性农业深加工
- 考察大新和南宁农业产业园 农业大健康·李喜贵:赋能乡村振兴
- Java使用Future设置方法超时
- node:express:error---填坑之路