Linux 操作系统多路IO复用

1.多路IO复用

        多路I/O复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

        这个机制能够通过select/poll/eroll等来使用。这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内并发交替地顺序完成。

        帮助TCP处理阻塞,多路IO复用是一种集中阻塞的方式!

1.1 Select

        select仅仅知道有I/O事件发生了,却并不知道是哪几个文件描述符,我们只能无差别轮询所有流,找出能读出数据。

函数原型:

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

形参:

        nfds:轮询的最大文件描述符+1

        readfd:监控集合中读变化,列如监控服务器的套接字放到读集合中

        writefds:监控集合中描述符的写变化   一般填NULL

        exceptfds:监控集合中描述符的异常变化    NULL

        timeout:具体填写一下结构体中的成员,表明在指定时间内监控变化,超时直接返回;

赋值为0;表示非阻塞(函数运行时,有描述符变化,得到对应信息,如果没有描述符改变,函数直接返回)

复制NULL:阻塞,select函数运行开始,等待直到描述符发生改变

Struts timeval
{long tv_sec; /* seconds */long tv_usec; /* microseconds */
}

返回值:成功返回发生变化的描述符的个数;超时返回0;失败返回-1

注意:调用一场select只能监控一次描述符的变化,集中的描述符发生改变后,会从集合自动消除,因此需要做好备份。

操作集合相关函数:

void FD_CLR(int fd, fd_set *set); //将 fd 从集合中去除
int FD_ISSET(int fd, fd_set *set);//判断集合中 fd 是否发生变化, 是返回真
void FD_SET(int fd, fd_set *set);//将 fd 添加到集合中
void FD_ZERO(fd_set *set);//清空集合

1.2 poll

        poll 本质上和 select 没有区别, 它将用户传入的数组拷贝到内核空间, 然后查询每个 fd 对应的设备状态, 但是它没有最大连接数的限制, 原因是它是基于链表来存储的。

函数原型:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

形参:

fds:结构数组,关于监测的描述符的具体描述

struct pollfd
{int   fd;    //监测的描述符short events;//请求监测的事件short revents;//实际发生的时间,由内核填充
};

events 和revents可用值:

nfds:监测的描述符的个数

timeout:

        0    表示非阻塞

        >0  指定毫秒数内监测

        -1  阻塞等待描述符变化

返回值:成功返回描述符发生的个数,失败返回-1,超时并且没有描述符发生变化返回0。

1.3 epoll

        epoll会把那个流发生了怎么的I/O事件通知我们

1.3.1 创建epoll句柄

头文件:

#include <sys/epoll.h>

函数原型:

int epoll_create(int size);

形参:size大于0;(Linux2.6.8 之后, 该值被忽略, 但是填充的值必须大于 0)

返回值:成功返回epoll描述符,失败返回-1

注意:不使用epoll时,记得使用close关闭

int  epfd = epoll_create(1);

1.3.2 注册epoll 监控事件

函数原型:

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

形参:
        epfd: epoll_create 返回值
        op:
                EPOLL_CTL_ADD 向 epoll 中注册描述符事件
                EPOLL_CTL_DEL 从 epoll 中移除描述符对应的事件, 此时第四个参数写 NULL
fd: 要处理的套接字
event: 由 op 决定
        op: EPOLL_CTL_DEL 的话, 填 NULL
                EPOLL_CTL_ADD, 此时填写下面的结构体

typedf nuion epoll_date
{void    *ptr;int      fd;uint32_t  u32;uint64_t  u64;
}epoll_data_t;struct  epoll_event
{uint32_t    events;epoll_data  data;
};

events:

        EPOLLIN: 读操作
        EPOLLOUT: 写操作
        EPOLLERR: 出错
返回值: 成功返回 0 失败返回-1

1.3.4 等待事件发生

函数原型:

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

形参: epfd: epfd 句柄
        events: 是传出参数, 所发生的事件填充到 events 指向的空间,
                注意: events 指向的空间在程序中自己定义好
        maxevents: 事件中最多有多少描述符;
        timeout: >0 在对应的毫秒时间内检测
                =0 非阻塞
                -1 阻塞, 直到事件发生函数才会返回
返回值: 成功返回描述符发生改变的个数
        超时并且没有描述符发生改变返回 0
        失败返回-1

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

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

相关文章

文件流-二进制文件(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 建立两个二进制磁盘文件f1.dat,f2.dat&#xff0c;编程实现以下工作&#xff1a; &#xff08;1&#xff09;将20个整数&#xff08;可在程序中初始化&#xff09;&#xff0c;分别存放到两个磁盘文件中&#xff0c;前10个放到f1.dat中&…

Linux下网络命令

目录 需求1-查看本机是否存在22端口解法1解法2解法3 需求2-查看其他主机是否存在22端口解法1解法2解法3 需求3-查看TCP连接解法1/2 需求4-统计80端口tcp连接次数解法 需求5-查看总体网络速度解法 需求6-查看进程流量解法 需求7-dns解法 需求8-traceroute到baidu解法 需求9-查看…

任务通知理论和使用

文章目录 一、任务通知是什么&#xff1f;1.1任务通知的优势1.2任务通知的限制1.3通知状态和通知值 二、任务通知的使用2.1任务通知使用_轻量级信号量2.2任务通知使用_轻量级队列2.3任务通知使用_轻量级事件组 一、任务通知是什么&#xff1f; 我们使用队列、信号量、事件组等…

浅析视频汇聚EasyCVR视频融合云平台在机场安防智能检测建设中的应用

一、背景 机场作为国家交通枢纽和对外开放的窗口&#xff0c;其安全运行直接关系到乘客的生命安全、国家形象以及社会经济稳定。随着全球航空业的快速发展和人们出行需求的持续增长&#xff0c;机场作为重要的交通枢纽&#xff0c;其客流量和货运量均呈现出快速增长的态势。然而…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

Python模块之Numpy(三)-- 数组的访问

Numpy对数组的操作十分高效&#xff0c;这主要源于其对索引的使用。数组索引的使用和列表&#xff08;list&#xff09;类似&#xff0c;索引都是从0开始&#xff0c;在访问或者批量引用时&#xff0c;遵循左闭右开的原则。 对于一维数组 import numpy as np arr np.arange(…

SD-WAN供应商选择指南

企业网络日益演变&#xff0c;尤其是跨国企业、出海电商和外贸企业&#xff0c;其网络需求变得愈发复杂多样。SD-WAN技术因此备受瞩目&#xff0c;成为连接分支机构和数据中心的关键解决方案。然而&#xff0c;市面上的SD-WAN供应商众多&#xff0c;如何选择适合的服务商成为了…

gitignore配置不生效记录

第一种可能性&#xff1a; 在你所有的文件都通过了git add . 命令的情况下&#xff0c;使用指令git rm -r --cached .进行缓存清除&#xff0c;完成之后&#xff0c;再次通过git add . 然后通过git status去看提交的文件都有哪些。 第二种可能性 如果上面的不行就是你添加的…

混合使用MFC与QT的深度技术分析

混合使用MFC与QT的深度技术分析 目录 混合使用MFC与QT的深度技术分析 一、引言 二、MFC与QT概述 三、混合使用场景分析 四、技术挑战与解决方案 五、实操&#xff1a;集成QT模块至MFC应用 六、性能考量与优化策略 七、安全性分析 八、案例研究 九、总结与未来展望 一、…

【机器学习】Scikit-Learn:Python机器学习的瑞士军刀

Scikit-Learn&#xff1a;Python机器学习的瑞士军刀 一、Scikit-Learn简介二、Scikit-Learn的核心功能数据预处理模型选择模型评估模型部署 三、Scikit-Learn的中文社区与API四、代码实例&#xff1a;使用Scikit-Learn进行鸢尾花数据集分类 在当今这个数据驱动的时代&#xff0…

C++ Primer 中文版(第 5 版)- 第四单元

第四单元 练习 4.1 编写一段程序&#xff0c;使用条件运算符从vector中找到哪些元素的值是奇数&#xff0c;然后将这些奇数值翻倍。 #include <iostream> #include <vector>using std::cout; using std::endl; using std::vector;int main() {vector<int>…

论文《Deep graph tensor learning for temporal link prediction》阅读

论文《Deep graph tensor learning for temporal link prediction》阅读 论文概况IntroductionRelated work动态图表示学习图张量表示 Preliminary张量生成建模 深度图张量学习模型A.基于图紧凑的空间表示B.时间模式表示C.时空特征聚合D.损失函数 实验数据集对比实验消融实验参…

美易官方:美国房地产贷款逾期率飙升,银行业危机仍可控?现货黄金暂守2360

美国房地产贷款逾期率飙升&#xff0c;银行业危机仍可控&#xff1f;现货黄金暂守2360 近年来&#xff0c;美国房地产市场一直处于波动之中&#xff0c;尤其是商业房地产领域。近期&#xff0c;美联储发出警告&#xff0c;称商业房地产贷款逾期率持续攀升&#xff0c;银行正在为…

鸿蒙ArkUI开发:常用布局【交叉轴】

交叉轴 垂直于主轴方向的轴线。Row容器交叉轴为纵向&#xff0c;Column容器交叉轴为横向。通过alignItems属性设置子元素在交叉轴&#xff08;排列方向的垂直方向&#xff09;上的对齐方式alignSelf属性用于控制单个子元素在容器交叉轴上的对齐方式&#xff0c;其优先级高于al…

M 有效算法

M 有效算法 本题考验二分知识&#xff0c;思路是二分k的取值&#xff0c;就按第一组样例来说当我们k取值为1的时候我们遍历数组想让|8-x|<k1的话x的取值范围是7-9&#xff0c;想让|3-x|<k2的话x的取值范围是1-5&#xff0c;两者x的区间不重合&#xff0c;说明肯定没有x能…

【力扣】164. 最大间距

164. 最大间距 题目描述 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0c;相邻元素之间最大的差值 。如果数组元素个数小于 2&#xff0c;则返回 0。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 示例 1: 输入: nums [3,6,9,…

几种ssh自动登录服务器的方法

一、Windows环境 1. 配置公钥和私钥 https://developer.aliyun.com/article/1132156 2. 使用putty.exe 官网见&#xff1a;https://www.putty.org/ 下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 使用示例如下&#xff1a; echo of…

BGP—边界网关协议

BGP 动态路由协议可以按照工作范围分为IGP以及EGP。IGP工作在同一个AS内&#xff0c;主要用来发现和计算路由&#xff0c;为AS内提供路由信息的交换&#xff1b;而EGP工作在AS与AS之间&#xff0c;在AS间提供无环路的路由信息交换&#xff0c;BGP则是EGP的一种。 BGP是一…

打开深度学习的锁:(0)什么是神经网络?有哪些必备的知识点准备?

PS&#xff1a;每每温故必而知新 什么是神经网络&#xff1f; 一、一个单神经元的神经网络二、多个单神经元的神经网络三、到底什么是机器学习&#xff1f;&#xff08;重点&#xff09;1&#xff1a;什么是机器学习的训练&#xff1f;2&#xff1a;什么是模型&#xff1f;权重…

接口测试全流程扫盲..

一.为什么要做接口测试&#xff1f; ①.越底层发现bug&#xff0c;它的修复成本是越低的。 ②.前端随便变&#xff0c;接口测好了&#xff0c;后端不用变&#xff0c;前后端是两拨人开发的。 ③.检查系统的安全性、稳定性&#xff0c;前端传参不可信&#xff0c;比如京东购物…