我们知道,可以将套接字放入到epoll中监听,当套接字上有事件发生时,epoll就会通知我们。epoll机制可以监听套接字上的以下6种事件:
  • EPOLLIN:套接字可读
  • EPOLLOUT:套接字可写
  • EPOLLRDHUP:对端关闭了套接字,或者对端关闭了写
  • EPOLLPRI:套接字上有紧急数据到达
  • EPOLLHUP:对端挂断了套接字
那么,什么情况下会在套接字上触发以上6种事件呢?当我们监听套接字上的EPOLLIN + EPOLLRDHUP事件时,总结如下:
  • 监听套接字上有连接到达时,监听套接字上将触发EPOLLIN(可读)事件;
  • 连接套接字上有数据到达时,套接字上将触发EPOLLIN(可读)事件;
  • 如果对端发送数据后立即关闭套接字或shutdown写,则本端在收到最后一个数据包时会触发EPOLLIN+EPOLLRDHUP事件;
  • 对端按ctr+c杀死进程时,本端的套接字上将触发EPOLLIN+EPOLLRDHUP事件;
  • 对端shutdown写,本端的套接字上触发EPOLLIN+EPOLLRDHUP事件;
  • 本端调用shutdown关闭写,本端的套接字上不产生事件;
  • 对端shutdown读,本端的套接字上不触发任何事件;
  • 本端调用shutdown关闭读,本端的套接字上将触发EPOLLIN+EPOLLRDHUP事件;
  • 对端shutdown读写,本端的套接字上触发EPOLLIN+EPOLLRDHUP事件;
  • 本端shutdown读写,本端的套接字上触发EPOLLIN+EPOLLHUP+EPOLLRDHUP事件;
  • 当关闭(close)套接字时,内核会自动将套接字描述符从epoll中删除,因此本端不会再触发任何事件;
  • 当对端关闭(close)套接字(该套接字只被一个进程引用)时,其效果与shutdown读写一样,本端的套接字上触发EPOLLIN+EPOLLRDHUP事件;
  • 当对端关闭(close)或shutdown写后,本端的套接字上触发EPOLLIN+EPOLLRDHUP事件,并且这两个事件将一直存在epoll中。也就是说,在水平触发模式下,只要对端shutdown或关闭套接字了,本端就会不断触发EPOLLIN+EPOLLRDHUP事件。另外如果是边沿触发模块,如果该套接字上后续再有其他事件触发,这两个事件也会一起触发。
  • 在调用close关闭套接字时,如果该套接字描述符在内核中的引用计数为1,内核将shutdown读写,如果如果该套接字描述符在内核中的引用计数大于1(比如创建一个套接字后又fork出一个子进程),close只是递减引用计数后立即返回,这样另一个进程还可以继续使用这个套接字。这种情况下,如果要关闭这条连接,应当调用shutdown,此时会给对端发送FIN信号。
  • 如果对端已close套接字(或shutdown了读写),本端继续在这个套接字上发送数据,虽然数据可以正常发送出去,但本端会收到对端发来的RST信号,从而触发本端的EPOLLIN+EPOLLRDHUP+EPOLLHUP+EPOLLERR事件。
  • 对端shutdown写,本端会触发EPOLLIN+EPOLLRDHUP事件,如果本端继续在套接字上发送数据,则可以正常发送,对端也可以正常接收(即对端触发EPOLLIN信号)。
  • 对端shutdown读,对端自身会触发EPOLLIN+EPOLLRDHUP事件,但本端不会触发任何事件。如果对端已shutdown读,当本端继续在这个套接字上发送数据时,数据可以正常发送出去,对端则会触发EPOLLIN+EPOLLRDHUP事件,当然,如果对端愿意,仍然可以读取到这些数据。
  • 对端不管是close套接字,还是shutdown写,本端触发的都是EPOLLIN+EPOLLRDHUP事件,因此,本端无从区分对端是close了套接字,还是shutdown了写。但有一点可以区分,如果对端是close了套接字,则本端在套接字上发送数据时,本端会收到对端发来的RST报文从而本端会触发EPOLLIN+EPOLLRDHUP+EPOLLHUP+EPOLLERR事件;而如果对端只是shutdown了写,则本端可以正常发送数据不会触发任何信号。
  • 在边沿触发模式下,当套接字上有数据到达时,将触发套接字上的EPOLLIN(即可读事件)1次,如果此时不去读该套接字上的数据并且套接字上没有新的报文到达,则后续不会再触发EPOLLIN事件。相反,在水平模式下,如果不去读,则该套接字上会不断触发EPOLLIN事件)。但是,如果套接字上再次有数据到达时,不管之前的数据有没有去读取,都会再次触发EPOLLIN事件。也就是说,在边沿触发模式下,每次有新数据到达时都会触发EPOLLIN事件。
  • 在边沿触发模式下,如果对端关闭套接字(或shutdown写),则不管之前套接字上的数据是否读取完毕,都会触发该套接字上的EPOLLIN+EPOLLRDHUP事件。
综上,可能出现的事件组合为:
1. EPOLLIN:
可读
2. EPOLLOUT:
可写
3. EPOLLIN + EPOLLRDHUP:
只可能是两种情况:
一是收到对端发来的FIN报文(可能是对端close套接字或shutdown写);
二是本端showdown读。
注意,这两个信号会一直留存在epoll中,即在水平触发模式下,会不断触发EPOLLIN+EPOLLRDHUP事件;边沿触发模式下,如果该套接字上后续再有其他事件触发,这两个事件也会一并触发。
4. EPOLLIN+EPOLLHUP+EPOLLRDHUP:本端shutdown读写。为避免套接字上触发该种组合的事件,在shutdown读写前,应该将套接字从epoll中移除。
5. EPOLLIN+EPOLLRDHUP+EPOLLHUP+EPOLLERR
收到对端发来的RST报文。通常是对端已经close了套接字或shutdown了读写,本端还往对端发送数据,此时会收到对端发来的RST报文。
可以认为,EPOLLRDHUP事件不会单独出现,它总是和EPOLLIN一起出现。如果我们在shutdown读写前将套接字从epoll中移除,可以认为EPOLLERR 总是和EPOLLHUP一起出现,它俩不会单独出现。

epoll触发事件的分析相关推荐

  1. Epoll触发事件的类型(转载)

    很Amazing,客服端关闭(close)居然不是触发epoll的EPOLLHUP事件,结果找了老半天的错误,记录一下.为此警惕自己,不能相信直觉,一切从文档出发. 以下内容均为转载(后面给出了原文的 ...

  2. java鼠标js触发事件吗,JavaScript常见鼠标事件与用法分析

    摘要:这篇JavaScript栏目下的"JavaScript常见鼠标事件与用法分析",介绍的技术点是"JavaScript.鼠标事件.鼠标.事件.用法.分析", ...

  3. WEB前端 -- 下拉框的触发事件分析(onchange、onfocus、onclick)

    select的onChange事件问题解决 (onchange.onfocus.onclick.onmousedown) 一.onChange事件只有在值改变时才可触发,所以必须在每一次选择时(尤其第 ...

  4. html 按下和松开事件,利用JQuery实现一个键盘按下与松开触发事件

    利用JQuery实现一个键盘按下与松开触发事件 发布时间:2020-11-09 16:14:22 来源:亿速云 阅读:105 作者:Leah 这期内容当中小编将会给大家带来有关利用JQuery实现一个 ...

  5. oracle gc chain,ORACLE GC 类等待事件汇总分析

    ORACLE GC 类等待事件汇总分析 作者简介: ---------------------------------------------------------------------- @ 孙 ...

  6. html select 选中触发,实现select中指定option选中触发事件

    我们在用到下拉列表框select时,需要对选中的 选项触发事件,其实本身没有触发事件方法,我们只有在select里的onchange方法里触发. 当我们触发select的双击事件时,用ondblcli ...

  7. 浅谈安全管理平台中的事件关联分析

    在当今社会中,随着信息技术的迅猛发展,企业内部的网络环境正面临着复杂多变的信息安全问题.这里既有来自于互联网对企业内网的各种入侵和攻击威胁,也有来自于企业内网中的违规操作和信息泄漏.为了应对层出不究的 ...

  8. html 输入框输入事件,input 输入框内的输入事件详细分析

    1.基础:本次分析原理就是在各个浏览器下input内容变化的时候触发事件的各种不兼容性.在ie下用onpropertychange事件,在其他浏览器里用input事件. 2.用例:对每个浏览器分别测试 ...

  9. Android笔记:触摸事件的分析与总结----多点触控

       其他相关博文:    Android笔记:触摸事件的分析与总结----MotionEvent对象    Android笔记:触摸事件的分析与总结----TouchEvent处理机制     An ...

最新文章

  1. ethereumjs/ethereumjs-vm-2-API文档
  2. 进来在看《How Tomcat Works》这本书,将读书笔记贴在这里,好记性不如烂笔头。
  3. writeValueAsString封装成工具类
  4. Win10不能使用Genymotion模拟器的解决方案
  5. phoenix+hbase+Spark整合,Spark处理数据操作phoenix入hbase,Spring Cloud整合phoenix
  6. 线性回归模型算法原理及Python实现
  7. Java集合性能分析-疯狂Java讲义
  8. python flask框架优点_python之全栈(Flask框架)
  9. sharepoint 在Visual Studio设置其他页面的加载标签
  10. 计算机网络系统juniper
  11. 虞老师在PRCV2021的Talk-Neural Human Reconstruction:From Rendering to Modeling
  12. Qt开发——图片缩放简述
  13. 解决iText 5.0.1生成pdf,加入iTextAsian.jar 出现异常 Font 'STSong-Light' with 'UniGB-UCS2-H'...
  14. 百度智能云BCC云服务器释放实例
  15. 使用cloud studio建立免费的云主机
  16. 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
  17. NAACL2021 信息抽取与少/零样本相关论文整理
  18. python发邮件附件_python 发送带附件的邮件
  19. 【疯壳·无人机开发教程1】开源编队无人机-开机测试
  20. 利用hfs工具上传文件的操作教程

热门文章

  1. 高频电子线路仿真-高频小信号谐振放大器
  2. 鸿蒙BETA版脱离安卓了吗,华为鸿蒙OS手机开发者Beta版来了,UI无变化,兼容安卓...
  3. 新能源汽车监控信息共享应用平台功能及应用探讨
  4. 信息的可用性带来最高价值的辅助决策回报
  5. 过滤器、vue内置指令
  6. objectarx + QT
  7. 如何判断是在做正确的事?
  8. 从Palm OS向Series 60 Platform移植(转)
  9. 【Web前端大作业】基于HTML+CSS+JavaScript制作西北大学新闻网站(7页)
  10. 工作日志的利器:迷人的MARKDOWN