Linux IO多路复用(多路转接)

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理 便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助 阅读详情

IO多路复用(多路转接)
在没有IO多路复用技术前,进程在同一时间只能监控一个IO状态(一个文件描述符的状态),例如A和B两个文件在操作,定的顺序是A前B后,那么在A阻塞过程中、B在后面也是不能被操作的,这样会造成资源浪费、响应缓慢。
IO多路复用:同时监控多个IO文件描述符状态,如果没有准备好的描述符、则进程始终处于睡眠状态(或超时返回);在监控期间内 如果有准备好的描述符,则立刻告诉进程,进程开始处理就绪的描述符。例如上面的A前B后的情形,使用IO复用技术则可同时监听A和B哪个就绪,接下来可优先处理已就绪的文件事件。

两种方法解决IO多路复用,epoll后续博客再说。


方法一 select : 

int select (int n,                        // 所有集合中文件描述符的最大值+1
            fd_set *readfds,            // 需监控的读 描述符集合
            fd_set *writefds,            // 需监控的写 描述符集合
            fd_set *exceptfds,            // 需监控的异常/带外数据的 描述符集合
            struct timeval *timeout);    // 超时时间

// 其中timeout参数:
/* 时间结构体 */
struct timeval {
    long tv_sec; /* seconds */
    long tv_usec; /* microseconds */
};

select在等待时间范围内,没有准备好的描述符,则会阻塞等待;在此期间 如果有文件描述符就绪,立刻返回。
返回值:通常情况下返回所有就绪的文件描述符的数目,发生错误返回-1 。
且在返回时,各描述符集合中 只保留 就绪的文件描述符。

select调用超过一定时间(参数timeout),还没有准备好的描述符,则 select() 调用返回0(就绪的描述符数量为0)。

以下是管理文件描述符集合的宏:

/* 以下是一些宏,管理文件描述符集合 */
FD_CLR(int fd, fd_set *set);    // 从set集合中移除一个描述符fd
FD_ISSET(int fd, fd_set *set);    // 测试某描述符fd是否在set集合中。返回值:0-不在;非负值-在
FD_SET(int fd, fd_set *set);    // 向set集合中添加一个描述符fd
FD_ZERO(fd_set *set);            // 从set集合中移除所有描述符

程序示例:

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main(){;
    fd_set read_fds;
    fd_set write_fds;

    FD_ZERO(&read_fds);
    FD_SET(STDIN_FILENO, &read_fds);    // 将STDIN_FILENO添加到监控的描述符中

    // 设定select等待时间
    struct timeval wait_time;
    wait_time.tv_sec = 5;   // 秒
    wait_time.tv_usec = 0;  // 微秒

    int select_rslt = select(STDOUT_FILENO + 1,
                             &read_fds,
                             NULL,
                             NULL,
                             &wait_time);

    if (select_rslt == -1) {
        perror("select");
        return 1;
    } else if (select_rslt == 0) {
        fprintf(stdout, "No fd is ready, and 5 seconds elapsed.\n");
        return 0;
    } else {
        // 有就绪的描述符
        if (FD_ISSET(STDIN_FILENO, &read_fds)) {    // 如果标准输入就绪
            char buf[20] = {0};
            int n_read = read(STDIN_FILENO, buf, 10);
            if (n_read == -1) {
                perror("read");
                return 1;
            }
            fputs(buf, stdout);
        }
    }
    return 0;
}


方法二 poll :

int poll (struct pollfd *fds,         // struct pollfd的数组
            unsigned int nfds,        // 上面数组中的元素个数
            int timeout);            // 等待的时间长度(毫秒),负数表示永远等待,0表示立即返回
             
// 其中 struct pollfd如下:
struct pollfd {
    int fd;         // 监视的文件描述符
    short events;     // 要监视的事件,由用户设置
    short revents;     // 发生的事件,内核设置
};

参数 fds 说明: 一个struct pollfd代表一个文件描述符,结构内:fd是文件描述符值,events是用来被用户(即程序员)设置希望可监听的属性(例如可读、可写等等),revents是内核返回时设置的已发生的事件(例如这个描述符已经可写、可读等等)。

返回值:返回pollfd结构体中,revents非零的结构体的个数(其实就是有事件发生的描述符个数)。

并且在返回时,可查看相应文件描述符的pollfd结构中的 revents字段,根据此字段判断描述符是否可操作。

程序示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/poll.h>

int main() {
    struct pollfd fds[2];
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;     // 监听标准输入是否可读

    int time_wait = 3;

    int poll_rslt = poll(fds, 1, time_wait * 1000);

    if (poll_rslt == -1) {              // poll() error
        perror("poll");
        return 1;
    } else if (poll_rslt == 0) {        // non fd is ready
        fprintf(stdout, "No fd is available.\n");
        return 0;
    } else {
        if (fds[0].revents & POLLIN) {      // 判断 fds[0]是否可读
            char buf[20] = {0};
            ssize_t n_read = read(STDIN_FILENO, buf, 5);
            if (n_read == -1) {
                perror("read");
                return 1;
            }
            puts(buf);
        }
    }

    return 0;
}

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程 本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。 阅读详情

相关推荐

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速)

本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。

peach的博客 961

非阻塞IO

以前各个版本套接字的默认状态是阻塞的,这样带来的时间消耗是巨大的。我们可以修改其为非阻塞版本。 非阻塞式IO方式重写str_cli函数 void str_cli(FILE *fp,int sockfd){ int maxfdp1,val,stdineof; ssize_t n,nwritten; fd_set rset,wset; char to[MAX

hober的专栏 468

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月14日-Clamshell 拆卸与安装

Clamshell 拆卸与安装。

weixin_46735260的博客 1684

select函数基本使用

select函数结构如下: int select( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout ); 参数 timeout可以分 3 种情况: 当timeout == NULL 时,表...

Thanos_2019的博客 335

2024最新版:MacOS Sonoma系统下CocoaPods安装全攻略(解决Ruby版本冲突)

本文详细介绍了在MacOS Sonoma系统下安装CocoaPods的全过程,重点解决Ruby版本冲突问题。通过HomeBrew安装最新Ruby版本,配置环境变量,并正确安装CocoaPods,帮助iOS开发者顺利管理项目依赖。文章还提供了常见问题的解决方案和优化配置建议,确保开发环境的稳定性和高效性。

lll78的博客 1042

STGCN实战:从零构建PyTorch时空图卷积网络预测城市交通流

本文详细介绍了如何使用PyTorch从零构建时空图卷积网络(STGCN)进行城市交通流预测。通过将交通网络建模为图结构,并融合时间卷积与空间图卷积,STGCN能有效捕捉交通流的时空依赖性。文章提供了从数据预处理、核心模块(TimeBlock与STGCNBlock)搭建、模型训练到实战技巧的完整指南,帮助开发者快速掌握这一前沿的交通速度预测技术。

wasm7browser的博客 246

fd_set解析

用到select,就难免不了要接触一下几个宏   fd_set set;   FD_ZERO(&set);   FD_SET(read_fd,&set);   select(MAX_NUM+1,&set,NULL,NULL,NULL);   if(FD_ISSET(read_fd,set){……} 这几个经常是按这种次序组合出现的,之前虽然也用过,但说实话,也就是用,根本不

u013774102的博客 1092

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6728

Linux网络编程系列之服务器编程——多路复用模型

Linux网络编程系列之服务器编程——多路复用模型,多路复用的简单介绍和使用

AABond的博客 1309

【毕设实战】飞行器目标识别系统:基于YOLOv5的智能检测全流程教程,助你毕设脱颖而出

本文介绍了一个基于YOLOv5的飞行器目标识别系统的开发过程。系统包含数据采集与标注、模型训练、实时检测和UI界面四大模块。文章详细讲解了从环境搭建、数据标注到YOLOv5模型训练的全流程,包括如何划分数据集、配置参数和测试模型性能。同时提供了实时检测代码示例和UI界面开发思路,使读者能够快速实现一个完整的智能检测系统。该系统可应用于军事侦察、民用巡检等领域,具有较高的实用价值,适合作为计算机视觉相关的毕业设计项目。

FJN110的博客 108

Lammps实现甲烷与水的竞争吸附-循环不同气体分子

Lammps实现甲烷与水的竞争吸附

Rockyoung 5373

Linux学习——多路复用

这样做用户线程再发起IO请求后可以立即返回,如果该次读操作并未读取到任何数据,用户线程需要不断的发起IO请求,直到数据到达后,才真正读取到数据,继续执行,整个过程中,虽然用户线程每次发起IO请求都可以立即返回,但是为了等到数据仍然需要不断轮询、重复请求,消耗大部分CPU资源。poll()与select()同样的缺点是包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就位,她的开销随着文件描述符数量的增加而线性增大。但是,这里fd、不能作为普通文件或目录的文件描述符;

m0_70569293的博客 2681

手把手教你学Simulink--巴特沃斯滤波器设计与实现仿真

巴特沃斯滤波器的设计目标是拥有尽可能平滑的通带响应,这意味着在通带内信号衰减最小且没有波动。这种类型的滤波器非常适合用于音频处理、生物医学信号处理以及其他需要高保真度的应用场景。根据应用需求的不同,可以选择低通、高通、带通或带阻滤波器。明确你的系统需求,如输入信号类型(正弦波、方波等)、滤波器类型(低通、高通、带通或带阻)、截止频率、滤波器阶数等。假设我们需要设计一个4阶低通巴特沃斯滤波器,其截止频率为1kHz,用来过滤掉高于1kHz的所有频率成分。

MHD0815的博客 449

Linux IO 模型纵深解析 06:IO 多路转接与多路复用的内核全链路实现

本文通过源码拆解揭示了IO多路机制的本质:三者均基于VFS的poll契约实现“检查+注册”逻辑。select与poll属于多路转接,内核不持久化监听关系,每次调用需线性扫描全量FD,效率随连接数增加而劣化。epoll则是真正的多路复用,通过内核对象eventpoll与红黑树固化关系,核心质变在于回调机制:事件触发时由内核主动将就绪项推入链表,使查询操作从O(n)转变为O(1)。这种从“主动轮询”到“事件驱动”的范式转变,是高并发下epoll性能卓越的根源。

a1933580388的博客 1092

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux 五种IO模型总篇(阻塞IO、非阻塞IO、信号驱动IO、多路复用IO(select、poll、epoll)、异步IO)

IO(Input Output)简单来说就是和,当底层数据没有就绪时,等待数据就绪,当数据就绪时就拷贝数据到上层。对于怎么等和拷贝的问题,衍生出了五种IO模型,。前四种IO是,多路复用/多路转接IO是异步IO。信号IO是同步还是异步,具有一定争议。但普遍认为,所以信号IO也是同步IO。IO的同步、异步的概念与线程不同,这里的指的是指的是。。对于来说,它的高效体现在IO,其他的IO模型高效在。每一种IO,都有其对应的使用场景,没有说哪一种IO模型在任何情况下都完胜另一种IO模型。

laimaxgg 1539

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Linux网络编程】高级IO——五种IO模型

什么是IO呢?在冯诺依曼体系角度我们知道从外设把数据搬到内存这不就是Input吗,把数据从内存拷贝到外设中这不就是output吗。这不就是传说中的IO吗。没错,但是这种理解还不够深刻!那什么是高效IO呢?解决上面问题,我们在学习五种IO模型,五种IO模型那一种最高效?以及非阻塞IO的编写

fight_p的博客 2282

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux--IO模型_多路转接

1. 阻塞IO模型特点:在阻塞IO模型中,应用程序发起一个IO请求后会一直阻塞等待操作完成,直到数据准备好或者超时才返回结果。在等待IO完成期间,应用程序会处于阻塞状态,无法执行其他任务。典型应用:阻塞socket、Java BIO等。优点:实现难度低,开发应用较容易。缺点:不适用并发量大的应用,因为每个请求IO都会阻塞进程,需要为每个请求分配一个处理进程(线程),系统开销大。2. 非阻塞IO模型特点:应用程序发起一个IO请求后会立即返回,无需等待操作完成。

2301_76618602的博客 1410

Linux下常用的IO模型

Linux下常用的IO模型:1. 阻塞IOfgetsreadgetcharfreadfgetcrecvrecvfrom1. 让多个IO事件以同步方式处理,2. 多个IO事件之间互相影响3. CPU占有率低2. 非阻塞IO将IO对应的文件描述符设置成非阻塞方式。O_NONBLOCKfcntl1.非阻塞一般搭配轮询方式同时监测多个IO2.cpu占有率高3. 信号驱动IOSIGIO1.实现异步IO操作,节省CPU开销。

2401_89156690的博客 1620

多路转接IO

常见的多路转接技术有 select、poll 和 epoll,它们都是在 Linux 系统中使用的。Select特点:最古老的一种多路转接方式,在 UNIX 系统中广泛使用。优点:跨平台支持良好,适用于小规模的 I/O 操作。缺点:效率低下,无法处理大量的文件描述符。适用场景:适用于小规模的 I/O 操作,对性能要求不高的情况。Poll特点:较 Select 更高效。优点:提供了更高的效率,能够处理大量的文件描述符。缺点:随着文件描述符数量的增加,性能仍会下降。适用场景。

FBI_BAIGOU的博客 980

Linux网络编程—— IO多路复用

 I/O 多路复用 使得程序能 同时监听 多个文件描述符,能够提高程序的性能,Linux 下实现 I/O 多路复用 的 系统调用主要有 select、poll 和 epoll。

weixin_43412762的博客 5329

初识Linux · 五种IO模型和非阻塞IO

前文我们已经将网络的基本原理介绍完了,都是通过围绕TCP/IP四层协议,将应用层,传输层,网络层,数据链路层全部介绍完毕,至于部分小主题,比如ARP欺骗,HTTP协议的原理,cookie以及session等内容,我们放在后面介绍。本文以及之后的内容,主要通过是介绍IO相关的问题,通过IO模型的介绍,从而引出多路复用的具体内容,通过介绍select,poll,epoll,最后再单独介绍一下Reactor,网络的基本原理我们就介绍完了。那么废话不多说,我们直接进入五种IO模型。

更新各种计算机技能~ 1264

高级IO(Linux)

你网购了好几个快递,张三快递员先给你派发了几个快递,你并没有去拿,因为你知道张三肯定会一直通知你,直到把你所有的快递都给你为止,因此你一直在忙别的事,直到很晚采取拿快递;又过了几天,你又网购了几个快递,不过这次给你派发快递的小哥李四不同于张三,他打电话通过你,并告知你:如果你不抓紧拿快递,那么就再也不通知你,你没有办法只能一次性将所有的快递都拿走;如果用户一次并没有把所有数据发送完,还需要再次发送;李四,一个随心所欲的钓鱼佬,在等待鱼上钩的时候,做着其他的事情,是不是地观察一个鱼竿,有没有鱼上钩;

qq_68006585的博客 1673

Linux高级IO

高级IO、epoll、poll

m0_57304511的博客 1125

[Linux网络]高级I/O与多路转接详解

IO操作:等待 + 拷贝,select只负责IO操作中的等待,同时一次可以等待多个读写事件(多个文件描述符)(1)返回值介绍:返回值:n>0: 有n个fd就绪了;n==0: 超时等待,没有错误但也没有fd就绪;n== -1: 等待出错,例如,等待的文件描述符已经关闭等错误。(2) struct timeval结构体tv_sec:是以秒为单位的时间戳tv_usec:微秒(3) 参数介绍nfds:传递的最大文件描述符 + 1(位图的大小)

m0_74207969的博客 1048

【Linux高级IO(一)】理解五种IO模型

1、应用层read&write的时候,本质把数据从用户写给OS ---- 本质就是拷贝2、IO = 等待 + 拷贝(大部分时间在等待,等到有数据了才进行拷贝)要进行拷贝,必须先判断条件成立。这个条件就是读事件就绪,就是读缓冲区有足够的数据可以读 写事件就绪就是发送缓冲区中要有足够的空间什么叫做高效IO呢?单位时间内,IO过程中,等的比重越小,IO效率就越高!其实几乎所有提高IO效率的策略,本质就是让等的比重变小。

weixin_74792326的博客 988

【校招 --阶段二 linux操作系统】高级IO多路转接之select

IO=等待+拷贝 读IO{读recv}=读时间就绪+内核数据拷贝到用户空间(将内核数据拷贝到TCP接受缓冲区) 写IO(写send)=写时间就绪+将用户空间数据拷贝拷贝到内核空间(将TCP发送缓冲区数据拷备到内核空间) 高效IO本质就是减少尽可能的减少等待时间的比重 五种IO模型 钓鱼例子说明: 钓鱼在大多数时间都在等待,只有一瞬间在钓鱼。所以在等待时间即相当于IO等待时间,钓鱼相当于拷贝 张三:当没有鱼上沟时一直在等待什么事都不做,只有鱼上钩了才动。他一直坐在位置上等待鱼上钩(阻塞时IO) 李四:他.

qq_50408340的博客 1713
上一篇: Mysql导出表、导入表相关操作
下一篇: 配置:.vimrc
Yancy Piggy
博客等级 码龄14年 27粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值