EPOLL事件之EPOLLRDHUP
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开连接,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。
对这个现象深入分析后发现,这是一个基于epoll的连接池实现上的问题,或者说是特性。
首先解释一下导致这个现象的原因。
在使用epoll时,对端正常断开连接(调用close()),在服务器端会触发一个epoll事件。在低于2.6.17版本的内核中,这个epoll事件一般是EPOLLIN,即0x1表示连接可读。
连接池检测到某个连接发生EPOLLIN事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样以来,上层尝试在对端已经close()的连接上读取请求,只能读到EOF,会认为发生异常,报告一个错误。
因此在使用2.6.17之前版本内核的系统中,我们无法依赖封装epoll的底层连接库来实现对对端关闭连接事件的检测,只能通过上层读取数据进行区分处理。
因此在使用2.6.7版本内核中增加EPOLLRDHUP事件,表示对端断开连接,关于添加这个事件的理由可以参见 http://lkml.org/lkml/2003/7/12/116。
在使用2.6.17之后版本内核的服务器系统中,对端连接断开触发的epoll事件会包含EPOLLIN | EPOLLRDHUP,即0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层。
重现这个现象的方法很简单,首先telent到server,然后什么都不做直接退出,查看在不同系统中触发的事件码。
注意,在使用2.6.17之前版本内核的系统中,sys/epoll.h的EPOLL_EVENTS枚举类型中是没有EPOLLRDHUP事件的,所以带EPOLLRDHUP的程序无法编译通过。
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相当于一个效率较高 ...
最新文章
- 顺序队列之C++实现
- PyQt5 技术篇-鼠标移动控件显示提示,Qt Designer控件提示设置方法。
- numpy.linspace详解
- MySQL复制表-INSERT INTO SELECT
- 【Linux】一步一步学Linux——cp命令(31)
- android dialog 结构,Android 原生Dialog实现
- 计算机科学导论课后单词,计算机科学导论课后总结
- RxHttp 一条链发送请求之强大的Param类(三)
- 数据库面试要点:关于MySQL数据库千万级数据查询和存储
- layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
- 图像数据流识别圆形_python opencv :使用Hough变换检测圆形,数钱。
- Caffe学习系列(16):caffemodel可视化
- 最详细的Quartus + Modesim完整波形仿真过程
- KNX智能照明系统在福安中医院的应用
- python培训大数据分析师_CPDA数据分析师需要深入的学习python等工具吗?
- sql server的linux版命令行,Linux配置SQLServer
- Java语言实现文本转语音
- 现代汉语常用3500字=常见字2500字+次常见字1000字
- Python+OpenCV中的Shi-Tomasi角点检测实现(附代码)
- PHPExcel出现 Formula Error的解决方案
热门文章
- 2021牛客多校1 - Find 3-friendly Integers(数位dp)
- HDU - 4333 Revolving Digits(扩展KMP)
- UVa810 A Dicey Problem 筛子难题
- Jupyter-进阶教程
- 不平等博弈问题学习记录(一)(超实数篇)
- 2.IDA-数据显示窗口(反汇编窗口、函数窗口、十六进制窗口)
- windbg 符号表
- 另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测)
- C,C++中使用可变参数
- 网卡MAC地址相关信息大全