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

【Linux:epoll】

目录

epoll与select、poll的区别:

epoll操作函数:

int epoll_create(int size);

epoll_ctl: 

epoll_wait: 


epoll与select、poll的区别:

  • select,poll底层是一个线性表的结构,而epoll是一个红黑树结构。
  • epoll、poll不能跨平台
  • select和poll的检测是线性检测,而epoll使用的是回调机制
  • select和poll存在用户/内核之间频繁拷贝数据的问题,但epoll不存在,在epoll中,内核和用户共用一块共享内存
  • 使用epoll没有最大文件描述符的限制,仅受系统中进程能打开的最大文件数目限制
  • 程序员通过epoll能直接拿到已就绪的文件描述符集合,不需要再次检测,而select和poll返回的集合需要判断才能知道哪些文件描述符就绪

epoll操作函数:

int epoll_create(int size);

  • 函数参数:在linux2.6.8以后,该参数是忽略的,只需要指定一个>0的数即可
  • 函数返回值:
    • 失败:-1
    • 成功:返回一个有效的文件描述符,通过这个文件描述符就可以访问创建的epoll实例 

epoll_ctl: 

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  • 函数的作用是管理红黑树实例上的节点,可以进行添加、删除、修改操作。 
  • 参数:
    • epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
    • op:一个枚举值。控制通过该函数该执行的操作
      1. EPOLL_CTL_ADD:往epoll模型中添加新节点
      2. EPOLL_CTL_MOD:修改epoll模型中存在的节点
      3. EPOLL_CTL_DEL:删除epoll模型中指定的节点
    • fd:文件描述符,即要添加/修改/删除的文件描述符
    • event:epoll事件,用来修饰第三个参数对应的文件描述符,指定检测该文件描述符的什么事件
  • 返回值:
    • 成功:0
    • 失败:-1

详细解释参数event:

event是一个结构体,有两个成员:events和data。

  • events:是一个委托epoll检测的事件,可以指定的epoll事件(常用)
    • EPOLLIN:读事件, 接收数据, 检测读缓冲区,如果有数据该文件描述符就绪
    • EPOLLOUT:写事件,发送数据,检测写缓冲区,如果可写文件描述符就绪
    • EPOLLERR:异常事件
  • data:传入的指定数据(备注传入事件的一些信息,例如事件存储在哪一个文件描述符),添加文件描述符时,没有指定任何data信息,则传出时,data联合体中没有数据,data中含有四个成员,一般情况下指定fd 。

epoll_wait: 

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

  •  epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
  • events:传出参数,这是一个结构体数组的地址,里面存储了已就绪的文件名描述符信息
  • maxevents:修饰第二个参数,结构体数组的容量
  • tomeout:如果检测的epoll实例中没有就绪的文件描述符,该函数的阻塞时长
    • 0:函数不阻塞
    • >0:如果epoll中没有已就绪的文件描述符,函数阻塞的毫秒数再返回
    • -1:函数一直阻塞
  • 返回值:
    • 成功:=0:函数阻塞被强制解除,没有检测到满足条件的文件描述符。>0:返回检测到已就绪的文件描述符个数
    • 失败:-1

http://www.kler.cn/a/397173.html

相关文章:

  • ZooKeeper集群指南-新增节点配置
  • 对接阿里云实人认证
  • 自存 关于RestController请求传参数 前端和后端相关
  • sql注入之二次注入(sqlilabs-less24)
  • Android 中的 Zygote 和 Copy-on-Write 机制详解
  • flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例
  • Wireshark 分析SQL 批量插入慢的问题
  • 江苏显卡服务器有哪些好处?
  • 3D Gaussian Splatting 代码层理解之Part1
  • 【NodeJS】Node.js是什么?能做什么?
  • 基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
  • layui 输入框带清空图标、分词搜索、关键词高亮
  • DevExpress WinForms中文教程:Data Grid - 如何绑定到实体框架数据源?
  • 单词 Watch 讲解
  • ES-针对某个字段去重后-获取某个字段值的所有值
  • influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI
  • 怎么样去挑选适合的CMS建站系统?
  • AI写作(十)发展趋势与展望(10/10)
  • 精密机加工 —— 工业制造的核心力量!
  • STM32寄存器结构体详解
  • Android View 调用基础 通用属性基础 方法场景说明
  • 241115-如何用sklearn做一个简单线性回归
  • 如何实现主备租户的无缝切换 | OceanBase应用实践
  • Ubuntu24.04配置安装可视化terminal终端
  • 解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  • React Native 全栈开发实战班 - 用户界面进阶之自定义组件开发