文章目录

  • 0 - 前言
  • 1 - epoll接口
    • epoll_create
    • epoll_ctl
    • epoll_wait

0 - 前言

参考:epoll机制:epoll_create、epoll_ctl、epoll_wait、close

1 - epoll接口

epoll_create

#include <sys / epoll.h>nfd = epoll_creat(max_size);

创建一个内核事件表 (也叫epoll句柄),nfd为epoll句柄(不了解句柄看下一段),参数max_size标识这个监听的数目最大有多大,从Linux 2.6.8开始,max_size参数将被忽略,但必须大于零。每个内核事件表占据一个fd。这个函数其实是在内核申请一块空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。max_size就是你在这个epoll fd上能关注的最大socket fd数。

返回值:成功时,这些系统调用将返回非负文件描述符。如果出错,则返回-1,并且将errno设置为指示错误。

句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个

参考:epoll_create详解

epoll_ctl

#include <sys / epoll.h>int epoll_ctl(int epfd,int op,int fd,struct epoll_event * event);

该系统调用对文件描述符epfd引用的epoll实例执行控制操作。它要求操作op对目标文件描述符fd执行。

函数参数:

  • epfd:由epoll_create产生的epoll句柄
  • op:要进行的的操作,比如EPOLL_CTL_ADD(注册新的fd到epfd中)、EPOLL_CTL_MOD( 修改已经注册的fd的监听事件)、EPOLL_CTL_DEL(从epfd中删除一个fd)
  • fd:需要监听的fd
  • event:指向epoll_event的指针,告诉内核需要监听什么事件

epoll_event是一个结构体,定义如下:


typedef union epoll_data {void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;struct epoll_event {__uint32_t events; /* Epoll events(也就是事件) */
epoll_data_t data; /* User data variable */

epoll_event中的成员events可以是:

  • EPOLLIN:表示对应的文件描述符上有可读数据
  • EPOLLOUT:表示对应的文件描述符上可以写数据
  • EPOLLPRI:表示对应的文件描述符有紧急的数据可读
  • EPOLLERR:表示对应的文件描述符发生错误
  • EPOLLHUP:表示对应的文件描述符被挂断
  • EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的
  • EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到epoll队列里

返回值:成功时,epoll_ctl()返回零。发生错误时,epoll_ctl()返回-1并正确设置了errno

参考:epoll_ctl详解

epoll_wait

#include <sys / epoll.h>int epoll_wait(int epfd,struct epoll_event * events, int maxevents,int timeout);

等待文件描述符epfd引用的epoll实例上的I/O事件

函数参数:

  • epfd:由epoll_create产生的epoll句柄
  • events:从内核得到事件的集合
  • maxevents:内核这个events有多大(数组成员的个数),这个maxevents的值不能大于创建epoll_create()时的size
  • timeout:超时时间(毫秒,0会立即返回,-1将永久阻塞),当超过timeout还没有事件触发时,就超时

返回值:需要处理的事件数目,若返回0表示已超时。

epoll_wait运行的原理:等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。并且,将注册在epfd上的socket fd的事件类型给清空。所以如果下一个循环你还要关注这个socket fd的话,则需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&ev)来重新设置socket fd的事件类型。这时不用EPOLL_CTL_ADD,因为socket fd并未清空,只是事件类型清空。这一步非常重要。

参考:epoll_wait详解

epoll详解【epoll_create】【epoll_ctl】【epoll_wait】相关推荐

  1. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

  2. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  3. Linux IO模式及 select、poll、epoll详解

    https://segmentfault.com/a/1190000003063859 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的. ...

  4. Linux IO复用区别与epoll详解

    转载:http://blog.csdn.net/hacker00011000/article/details/52160590 一.select.poll.epoll之间的区别总结[整理]  sele ...

  5. IO多路复用--epoll详解

    epoll 或者 kqueue 的原理是什么? [转自知乎] Epoll 引入简介 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是 ...

  6. 聊聊IO多路复用之select、poll、epoll详解

    聊聊IO多路复用之select.poll.epoll详解 2016/04/22 · IT技术 · 1 评论 · epoll, IO多路复用, poll, select 分享到:0 本文作者: 伯乐在线 ...

  7. c if 判断select已经选择的值_「Linux」——select和epoll详解

    select和epoll详解 select和epoll的区别(面试常考) select 一.什么是select 1.select函数原型 2.参数解释 3.参数timeout取值 4.返回值 5.监控 ...

  8. 【Linux学习】epoll详解

    什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll.当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new A ...

  9. Epoll详解及源码分析

    文章来源:http://blog.csdn.net/chen19870707/article/details/42525887 Author:Echo Chen(陈斌) Email:chenb1987 ...

最新文章

  1. 征文 | “‘互联网+’背景下大数据与税收征管的深度融合研究” 专题征文启事...
  2. java 反射 new区别_JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)...
  3. 若依微服务版在Windows上通过jar包运行业务模块时提示:Failed to determine s suitable driver class
  4. Scala Case类和对象
  5. Docker 安装创建
  6. 哥尼斯堡的“七桥问题” (欧拉回路,并查集)
  7. .NET 6 Preview 1发布!
  8. ios 打印 详细错误日志_iOS打印Debug日志的方式
  9. 模块化,组件化,插件化简析
  10. 飞凌小课堂-RK3399开发板 linux双千兆网口方案-RTL8153
  11. php支付宝查询对账单下载地址,通过调用支付宝查询对账单接口返回bill_download_url下载zip,解压缩...
  12. 电子线路与电磁干扰/电磁兼容设计分析
  13. hadoop 起动是的时候报错 localhost: Could not create the Java virtual machine._far beyond me,thks~~_百度空间...
  14. 训练一个图像分类器demo in PyTorch【学习笔记】
  15. 计算机组成原理唐朔飞第二版答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...
  16. unexpected char: '\' @ line 3, column 133. s\react-native-gestu
  17. mysql5.7.25安装包,Mysql5.7.25在windows下安装
  18. 使用ps优化图片,减少图片内存大小
  19. jenkins docker 编译verify出现crash的问题
  20. Altium Designer(四)排针类元件模型的创建

热门文章

  1. MyEclipse创建jsp项目
  2. Java Web应用开发简介
  3. matlab中caitu_tiqu,源码交流=图像处理 车牌号码识别[Tested]
  4. QT学习之路2 学习笔记
  5. vue3运行npm run serve无反应,选择跳转后会自动跳入文件路径中
  6. 这可能是JAVA程序员进阶架构师的最佳之路了 !
  7. uni-app【多媒体API】
  8. C++ QT调用python脚本并将软件打包发布
  9. android 导航栏navigation
  10. linux系统 安装nvm