IO多路复用几种函数

news2024/9/20 8:02:35

1. select()

函数原型

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

参数说明

  • nfds:指定文件描述符的范围。这个值应设置为所有文件描述符中最大值加一。例如,如果监视的文件描述符是 0 到 5,则 nfds 应设置为 6。
  • readfds:指向一个 fd_set 结构体的指针,该结构体表示要监视的可读文件描述符集合。调用 select() 之前,需要使用 FD_ZERO() 初始化该集合,并用 FD_SET() 添加文件描述符。调用 select() 后,集合中的文件描述符将更新为实际发生可读事件的文件描述符。
  • writefds:指向一个 fd_set 结构体的指针,该结构体表示要监视的可写文件描述符集合。用法与 readfds 类似。
  • exceptfds:指向一个 fd_set 结构体的指针,该结构体表示要监视的异常条件集合。用法与 readfds 类似。
  • timeout:指向一个 struct timeval 结构体的指针,表示 select() 的超时时间。如果超时前没有文件描述符状态变化,select() 将返回。如果设置为 NULL,则表示 select() 将无限期等待直到有事件发生。

返回值

 

优势

 

  • 成功:返回发生事件的文件描述符数量。
  • 失败:返回 -1,并设置 errno
    #include <sys/select.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        fd_set read_fds;
        struct timeval timeout;
        int max_fd = 0;  // 最大文件描述符编号
    
        // 初始化文件描述符集
        FD_ZERO(&read_fds);
        FD_SET(STDIN_FILENO, &read_fds);  // 监视标准输入
    
        timeout.tv_sec = 5;  // 设置超时时间为5秒
        timeout.tv_usec = 0;
    
        int ret = select(max_fd + 1, &read_fds, NULL, NULL, &timeout);
        if (ret == -1) {
            perror("select");
            return 1;
        } else if (ret == 0) {
            printf("Timeout occurred!\n");
        } else {
            if (FD_ISSET(STDIN_FILENO, &read_fds)) {
                printf("Data is available on stdin\n");
            }
        }
    
        return 0;
    }
    
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    2. poll()

  • 介绍

    poll() 是另一种 I/O 多路复用机制,允许应用程序监视多个文件描述符,等待它们的状态发生变化。与 select() 不同,poll() 使用一个数组来表示文件描述符。

    工作原理

  • 结构体poll() 使用 pollfd 结构体数组,其中包含要监视的文件描述符及其事件类型。
  • 事件类型pollfd 结构体中的 events 成员表示感兴趣的事件(如 POLLINPOLLOUT)。
  • 返回值:返回值表示活动的文件描述符数量。可以通过检查 revents 成员来判断哪个文件描述符有事件发生。
  • 文件描述符数量限制:没有像 select() 那样的文件描述符数量限制,只受限于系统的内存。
  • 性能改进:对大量文件描述符的处理性能较 select() 更好。
#include <poll.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    struct pollfd fds[1];
    int ret;

    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;  // 关注可读事件

    ret = poll(fds, 1, 5000);  // 超时时间为5000毫秒
    if
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

3. epoll() 

介绍

epoll() 是 Linux 特有的 I/O 多路复用机制,设计用于高效处理大量文件描述符,尤其适合需要高性能的网络服务和其他 I/O 密集型应用。epoll 提供了更好的扩展性和性能,尤其在处理大量文件描述符时优于 select()poll()

epoll_create()

函数原型

int epoll_create(int size);
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  • size:指定 epoll 实例的初始大小,但在现代 Linux 内核中,这个参数已被忽略。你可以传递任意值,但通常设置为 1。

返回值

  • 成功:返回一个新的 epoll 文件描述符。
  • 失败:返回 -1,并设置 errno
  •  

 epoll_ctl()

函数原型

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

参数说明

  • epfd:由 epoll_create() 返回的 epoll 文件描述符。
  • op:操作类型,取值为 EPOLL_CTL_ADD(添加文件描述符)、EPOLL_CTL_MOD(修改文件描述符)或 EPOLL_CTL_DEL(删除文件描述符)。
  • fd:要添加、修改或删除的文件描述符。
  • event:指向 epoll_event 结构体的指针,指定感兴趣的事件及事件处理的用户数据。

返回值

  • 成功:返回 0。
  • 失败:返回 -1,并设置 errno
  •  

epoll_wait()

函数原型

 

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

参数说明

  • epfd:由 epoll_create() 返回的 epoll 文件描述符。
  • events:指向 epoll_event 结构体数组的指针。epoll_wait() 将把发生事件的文件描述符及其事件填充到这个数组中。
  • maxeventsevents 数组的大小,即最大事件数量。
  • timeout:超时时间(以毫秒为单位)。设置为 0 表示非阻塞模式,设置为 -1 表示无限期等待。

返回值

  • 成功:返回发生事件的文件描述符数量。
  • 失败:返回 -1,并设置 errno
struct epoll_event {
    uint32_t events;      // 事件类型,例如 EPOLLIN、EPOLLOUT
    epoll_data_t data;    // 用户数据,通常用于保存文件描述符
};

常用事件标志

  • EPOLLIN:文件描述符可读。
  • EPOLLOUT:文件描述符可写。
  • EPOLLERR:发生错误。
  • EPOLLET:边沿触发模式(ET),文件描述符会在事件到达时通知一次
#include <sys/epoll.h>
#include <stdio.h>
#include <unistd.h>

#define MAX_EVENTS 10

int main() {
    int epfd = epoll_create(1);
    if (epfd == -1) {
        perror("epoll_create");
        return 1;
    }

    struct epoll_event ev, events[MAX_EVENTS];
    ev.events = EPOLLIN;  // 关注可读事件
    ev.data.fd = STDIN_FILENO;

    if (epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1) {
        perror("epoll_ctl");
        return 1;
    }

    int nfds = epoll_wait(epfd, events, MAX_EVENTS, 5000);  // 等待最多5000毫秒
    if (nfds == -1) {
        perror("epoll_wait");
        return 1;
    } else if (nfds == 0) {
        printf("Timeout occurred!\n");
    } else {
        for (int i = 0; i < nfds; i++) {
            if (events[i].events & EPOLLIN) {
                printf("Data is available on stdin\n");
            }
        }
    }

    close(epfd);
    return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

斯坦福大学cs231n (图像分类)

1.介绍 当作图像分类时&#xff0c;分类系统接收一些分类图像&#xff0c;比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么&#xff0c;计算机的工作就是根据图片&#xff0c;给他分配一些固定的分类或者标签。 对于一个计算机来说&#xff0c;这是一个非常…

【CVPR‘24】DeCoTR:使用 2D 和 3D 注意力增强深度补全

DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions 中文解析摘要介绍方法方法3.1 问题设置3.2 使用高效的 2D 注意力增强基线3.3 3D中的特征交叉注意力点云归一化位置嵌入3.4 捕捉 3D 中的全局上下…

软件测试常见面试题汇总(2024版)

一、常见的面试题汇总 1、你做了几年的测试、自动化测试&#xff0c;说一下 selenium 的原理是什么&#xff1f; 我做了五年的测试&#xff0c;1年的自动化测试&#xff1b; selenium 它是用 http 协议来连接 webdriver &#xff0c;客户端可以使用 Java 或者 Python 各种编…

MySQL的InnoDB、MyISAM的参数及常见错误码

1&#xff1a;参数 参数&#xff0c;也被称之为MySQL的系统变量&#xff0c;这些变量是影响MySQL运行的关键&#xff0c;对每个参数做出不同调整&#xff0c;都有可能直接影响到线上数据库的性能&#xff0c;具体的完整系统参数可参考《MySQL官网文档-系统变量》&#xff0c;官…

图表检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

图表检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

通过写文件方式写入 Hive 数据

通过写文件方式写入 Hive 数据 Hive最简单的写入数据方式就是通过Hive Jdbc写入Hive数据&#xff0c;但这并不是写入Hive最高效的方法。 Hive通过读取相关Hdfs的文件来获取数据信息&#xff0c;而通过直接写入Hdfs文件数据达到写入Hive数据的效果&#xff0c;这是目前最高效的…

《python语言程序设计》2018版第8章第2题检测子串,你可以用str类中的find方法检测一个字符串

我先用in来做一次 def find_text(text_input1, text_input2):a str(text_input1)b str(text_input2)if b in a:print(f"The {b} is in {a} ")else:print(f"The {b} is not in {a} ")text_n1 "Welcome to shenyang" text_n2 "to"fi…

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cachekey1 "admin" key2 "admin"app api.Api(routes[*zdppy_cache.zdppy_api.cache(key1, key2, api) ])if __name__ __main__:import zdppy_uvicornzdppy_uvicorn.run(app, host"0.0.0.0",…

JVM-类加载过程

类加载过程是 Java 虚拟机 (JVM) 将 Java 代码编译后的字节码文件加载到内存中&#xff0c;并进行解析和验证&#xff0c;最终使程序能够运行的关键步骤。 类加载过程&#xff1a;加载->连接->初始化。连接过程又可分为三步&#xff1a;验证->准备->解析。 1. 加载…

Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理)

目录 1. 简介 2. 解析 2.1 获取标签 2.1.1 载入数据集 2.1.2 标签-Index 2.1.3 保存和读取类别标签 2.2 读取单个图片 2.3 载入模型并推理 2.3.1 tiny-vgg 模型结构 2.3.2 运行推理 2.4 置信度柱状图 2.5 预测标签 3. 完整代码 4. 总结 1. 简介 本博文在《Vitis …

Python酷库之旅-第三方库Pandas(105)

目录 一、用法精讲 456、pandas.DataFrame.rdiv方法 456-1、语法 456-2、参数 456-3、功能 456-4、返回值 456-5、说明 456-6、用法 456-6-1、数据准备 456-6-2、代码示例 456-6-3、结果输出 457、pandas.DataFrame.rtruediv方法 457-1、语法 457-2、参数 457-3…

云计算实训38——docker网络、跨主机容器之间的通讯

一、docker⽹络 1.桥接--bridge 所有容器连接到桥就可以使⽤外⽹&#xff0c;使⽤nat让容器可以访问外⽹ 使⽤ ip a s指令查看桥&#xff0c;所有容器连接到此桥&#xff0c;ip地址都是 172.17.0.0/16 ⽹段&#xff0c;桥是启动docker服务后出现&#xff0c;在centos使⽤ br…

centos安装mysql8.0版本,并且实现远程连接

一、 卸载mysql 查看mysql安装情况 rpm -qa | grep -i mysql 删除上图中所有信息 rpm -ev mysql-community-release-el7-5.noarch --nodeps 再次查询&#xff0c;没有数据&#xff0c;则为删除干净 find / -name mysql rm -rf /var/lib/mysql 将机器上的所有mysql相关文…

一篇文章带你真正了解接口测试(附视频教程+面试真题)

一、什么是接口测试&#xff1f; 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试&#xff0c;则是通过接口的不同情况下的输入&#xff0c;去对比输出&#xff0c;看看是否满足接口规范所规定的功能、…

79.位域

目录 一.位域的概念 二.语法格式 三.无名位域 四.视频教程 一.位域的概念 有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态&#xff0c;开关只有开和关俩个状态&#xff0c;所以只需要使用0和1表示&#xff0c;也就是一个二进制位。所以这时候…

前端提升之——chrome浏览器插件开发指南——chrome插件介绍及入门

前言 有一天突发奇想&#xff0c;想要自己写一个浏览器插件玩一玩&#xff0c;并不做用于商业或者其他方面&#xff0c;仅仅用于自我技术的练习和提升。 这里的浏览器我选择Chrome&#xff0c;当然chrome插件同样适用于微软自带的 Microsoft Edge 在当今发达的互联网环境下&…

云微客短视频矩阵如何打造多元化的视频内容呢?

随着抖音、快手等平台的兴起&#xff0c;短视频已经成为了人们日常生活的一部分&#xff0c;也有不少企业通过短视频赛道实现了品牌曝光和获客引流&#xff0c;但是单一的视频内容终究很难长久的吸引用户&#xff0c;所以如何打造多元化的视频内容呢&#xff1f; 在这个快节奏的…

【二叉树】OJ题目

&#x1f31f;个人主页&#xff1a;落叶 目录 单值⼆叉树 【单值二叉树】代码 相同的树 【相同二叉树】代码 对称⼆叉树 【对称二叉树】代码 另一颗树的子树 【另一颗树的子树】代码 二叉树的前序遍历 【二叉树前序遍历】代码 二叉树的中序遍历 【二叉树中序遍历】…

【数据结构】栈和队列相互实现

目录 栈实现队列 思路 入队列 出队列 获取队头元素 队列实现栈 思路 入栈 出栈 获取栈顶元素 完整代码 栈实现队列 队列实现栈 栈实现队列 思路 栈的特点是 先进后出&#xff0c; 队列的特点是 先进新出&#xff0c;这就意味着我们无法通过一个栈来实现队列&…

YOLOv5改进 | 融合改进 | C3融合Efficient Multi-Scale Conv Plus【完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…