【Linux:epoll】

embedded/2024/11/18 21:08:22/

目录

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.ppmy.cn/embedded/138622.html

相关文章

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改,代码精略的写了一下。 注:场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅,自行处理。有个方法是直接在每个外面包一个DIV,用动态样式设置底色。 场景一、…

【Qt】QtCreator安装安卓环境

1、简述 在QtCreator中安装安卓开发环境的步骤: 安装java安装安卓SDK安装android_openssl(非必须)2、安装java 2.1 版本要求 本人QtCreator版本为:Qt Creator 10.0.1;Qt版本为6.5 尝试java23,编译时失败; 尝试java19,编译成功; 未尝试java17(这个版本是长期支持版…

Executor和Service

Executor和Service是Android开发中两个重要的概念,它们都用于处理后台任务,但有着不同的用途和特点。让我们来详细比较一下: 1. Executor(执行器): 定义:Executor是一个接口,用于管…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…

【计算机网络】TCP网络程序

一、服务端 1.tcpServer.hpp 此文件负责实现一个tcp服务器 #pragma once #include <iostream> #include <string> #include <cstring> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…

SQL注入注入方式(大纲)

SQL注入注入方式&#xff08;大纲&#xff09; 常规注入 通常没有任何过滤&#xff0c;直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理&#xff1a; 设置MySQL时错误配置…

MATLAB用CNN-LSTM神经网络的语音情感分类深度学习研究

全文链接&#xff1a;https://tecdat.cn/?p38258 在语音处理领域&#xff0c;对语音情感的分类是一个重要的研究方向。本文将介绍如何通过结合二维卷积神经网络&#xff08;2 - D CNN&#xff09;和长短期记忆网络&#xff08;LSTM&#xff09;构建一个用于语音分类任务的网络…