Linux高阶IO之select多路转接

news2024/9/27 13:03:57

文章目录

    • select多路转接
      • timeout
      • fd_set
      • 返回值
      • 执行过程
      • 总结

select多路转接

多路转接有三种方案,分别是select,poll和epoll,我们都会讲解和介绍

select的函数原型是这样的

在这里插入图片描述

他一共有五个参数,但是可以分为三组

  • nfds:需要监视的最大的文件描述符值+1
  • readfds:可读文件描述符集合
    writefds:可写文件描述符集合
    exceptfds:异常文件描述符集合
  • timeout:设置select等待的时间

就绪事件分为三种,可读事件,可写事件,异常事件

timeout

select可以帮我们同时等待多个文件描述符,但是如果一直轮询多个描述符是不合理的,我们应当可以设置他阻塞或者轮询

因此timeout可以传入三种数据

  • NULL : 表示没有timeout,select一直阻塞等待,直到有了就绪的文件描述符
  • 0 : 进检测文件描述符集合的状态,然后立即返回,不会进行任何阻塞等待,继续执行后面的逻辑
  • 确定的时间 : 阻塞指定的时间段,没有等到则超时返回

前两个都好理解,第三个的数据类型是timeval,要怎么用呢

他的内部有两个成员,分别对应了秒和微秒

长这样

struct timeval {
    __time_t      tv_sec;  // 秒
    __suseconds_t tv_usec; // 微秒
};

使用的时候需要线对他进行初始化,然后传入select即可

struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500;
// 等待1.5秒

fd_set

fd_set是中间三个文件描述符的类型,如果你了解信号,也一定猜到,这个fd_set是一共位图,你可以将你期待监视的文件描述符设置到这个位图中然后传递进去

但是我们不能直接操作这个数据结构,需要使用下面的函数,分别对应着删除\测试\设置\置零

在这里插入图片描述

返回值

select的返回值需要区分

  • 执行成功 : 返回文件描述符状态改变的个数
  • 0 : 阻塞等待超时
  • -1 : 出错了,错误原因在errno里,此时三个输出型参数的值是未知的

错误原因可能有

  • EBADF : 文件描述符无效或者文件描述符关闭
  • EINTR : 调用被信号中断
  • EINVAL : n为负值
  • ENOMEM : 核心内存不足

执行过程

其实最后一个参数timeout也是输出型参数

当你设置阻塞时间为5秒,等了3秒后时间就绪了,函数就返回了,timeout的时间就会变成2秒

fd_set也是这样的,我们把想要监视的文件描述符放在fd_set中,但是他返回的时候,只有就绪的文件描述符返回出来了,如果一开始设置了0,1,2,3,4,之后0和3就绪了,那么我们再拿到对应的fd_set,就只能读到0和3,原来的fd_set就消失了一样

因此如果我们想要循环进行select,每一次都需要重置过参数

总结

select能够同时监视多个文件描述符,但是也总是有上限的,上限就是fd_set位图的大小

除此之外,我们不仅需要维护fd_set,还需要额外维护放入fd_set中的数据集,否则我们无法使用FD_ISSET判断文件描述符是否就绪

而且每一次都需要重新逐一加入fd_set,然后再取出最大的文件描述符,作为第一个参数输入

所以这个系统调用是真难用,非常不便,还需要将fd_set从用户态拷贝到内核态,fd_set也不够大

但是这是第一个,有缺陷才是正常的,后面才会越来越好,有了poll和epoll

具体使用select写server的代码可以来我的github仓库来看看

LearnRep/CppCode at main · Ye-Yu-Mo/LearnRep (github.com)

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

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

相关文章

C#邮件发送:实现自动化邮件通知完整指南!

C#邮件发送性能怎么优化?使用C#发送邮件的设置步骤? 无论是用于客户服务、内部沟通还是项目管理,自动化邮件通知都能显著提高效率和响应速度。AokSend将详细介绍如何使用C#邮件发送功能来实现自动化邮件通知系统。 C#邮件发送:配…

二、词法分析,《编译原理》(本科教学版),第2版

文章目录 一、词法分析器1.1 词法分析器的作用1.2 词法分析器的设计方法1.3Antlr 词法分析器生成器1.3.1 环境准备1.3.2 词法分析器自动生成初体验(需了解少许正则表达式概念)1.3.2.1 创建工程1.3.2.2 空白符逻辑1.3.2.3 实现INT类型1.3.2.4 实现单行注释…

ClkLog常见问题-埋点集成篇Sec. 2

本篇将继续解答ClkLog使用过程中【埋点集成】阶段的常见问题。 1.【埋点集成】 问:receiver数据接收是不是一定要有ssl证书? 答:不是。 2.【埋点集成】 问:接收服务地址从哪里获取? 答:接收服务地址参考&am…

死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(一)

这是「死磕P7」系列第 003 篇文章,欢迎大家来跟我一起 死磕 100 天,争取在 2025 年来临之际,给自己一个交代。 上两篇介绍了 JVM 内存区域划分,简单记忆一下就可以了,后面再不断深入吧。 死磕P7: JVM内存划分必知必会…

Spring邮件发送:配置与发送邮件详细步骤?

Spring邮件发送教程指南?怎么用Spring邮件发送服务? Spring框架提供了强大的邮件发送支持,使得开发者能够轻松地在应用程序中集成邮件发送功能。AokSend将详细介绍如何在Spring应用中配置和发送邮件,帮助开发者快速掌握这一关键技…

浙大数据结构:06-图2 Saving James Bond - Easy Version

这道题是稍复杂版的dfs或bfs,此处我采用bfs实现 机翻: 1、条件准备 n为鳄鱼数量,jump为跳一次最大距离。 eyu数组对存每条鳄鱼的坐标位置,visit数组判断该鳄鱼是否走过,isalive判断到达该鳄鱼时能否逃离。 #includ…

探索图像生成大模型Imagen:原理、比较与应用

目录 目录 1. 引言 2. 图像生成模型的发展背景 2.1 生成对抗网络(GAN) 2.2 变分自编码器(VAE) 2.3 自回归模型 2.4 扩散模型 3. Imagen简介 3.1 模型架构 3.2 关键技术 3.3 训练数据与方法 4. Imagen与其他模型的比较 …

ArcGIS Pro高级地图可视化—双变量符号地图

ArcGIS Pro高级地图可视化 ——双变量符号地图 1 背景 “我不是双变量,但我很好奇。”出自2013 年南卡罗来纳州格林维尔举行的 NACIS 会议上,双变量地图随着这句俏皮的话便跳跃在人们的视角下,在讨论二元映射之后,它不仅恰逢其…

AOT源码解析4.5-AOT整体结构

论文阅读 papergithub论文阅读笔记AOT源码解析1-数据集处理AOT源码解析2-encoderdecoderAOT源码解析3-模型训练AOT源码解析4.1-model主体AOT源码解析4.2-model主体AOT源码解析4.3-model主体AOT源码解析4.4-model主体AOT源码解析4.5-model主体 4.1~4.4小节详细讲解了ref_imgs相…

15年408-数据结构

第一题 解析: 栈第一次应该存main的信息。 然后进入到main里面,要输出S(1),将S(1)存入栈内, 进入到S(1)中,1>0,所以还要调用S(0) S(0)进入栈中,此时栈内从下至上依次是main(),S(1),S(0) 答案选A 第二题&…

Java基于相似算法实现以图搜图

一、简述 本文主要讲如何利用图片相似性算法&#xff0c;基于LIRE来实现图片搜索。 二、依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><…

Apache Solr:深入探索与常见误区解析

Apache Solr&#xff1a;深入探索与常见误区解析 Apache Solr 是一个强大的搜索引擎&#xff0c;基于 Lucene 构建&#xff0c;广泛应用于电商平台、日志分析、内容管理系统等领域。Solr 的功能强大&#xff0c;然而它的配置和使用过程却不乏一些容易误解和出错的地方。本文将…

Spring validation校验框架

第1步&#xff1a;导入依赖 <!-- 校验框架--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 第2步&#xff1a;为需要校验的参数&…

Leetcode 739.42. 每日温度 接雨水 单调栈 C++实现

问题&#xff1a;Leetcode 739. 每日温度 算法1&#xff1a;从右到左 栈中记录下一个更大元素的「候选项」。 代码&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();vector<…

【echarts】报错series.render is required.

总结&#xff1a;就是echarts无法保存renderItem函数到json里&#xff0c;因为renderItem是个封装方法&#xff0c;因此需要初始化加载时重新插入renderItem即可 1.描述&#xff1a;控制台报错series.render is required. 原数据json如下&#xff1a; {type: "bar"…

【数学分析笔记】第3章第4节闭区间上的连续函数(2)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.4 中间值定理 【定理3.4.4】若 f ( x ) f(x) f(x)在 [ a , b ] [a,b] [a,b]上连续&#xff0c;则它一定能取到最大值 M M M与最小值 m m m之间的任何一个值。 M max ⁡ f ( x ) , x ∈ [ a , b ] , m min ⁡ f ( x ) , …

Vmware 静态ip配置

虚拟机网络设置NAT 查看当前的网络接口 ip addr编辑网络接口配置文件 sudo vi /etc/sysconfig/network-scripts/ifcfg-<接口名>配置静态 IP 地址 Vmware ➡ 编辑 ➡ 虚拟网络编辑器 ➡ Nat设置 参考上图进行配置&#xff0c;千万不要配置宿主机的配置 BOOTPROTOstat…

2023_Spark_实验十一:RDD基础算子操作

一、RDD的练习可以使用两种方式 使用Shell使用IDEA 二、使用Shell练习RDD 当你打开 Spark 的交互式命令行界面&#xff08;也就是 Spark shell&#xff09;的时候&#xff0c;它已经自动为你准备好了一个叫做 sc 的特殊对象&#xff0c;这个对象是用来和 Spark 集群沟通的。你…

女性在网络安全行业崛起,引领行业新风向

1、网络安全自诞生之日起&#xff0c;就与女性有着不解之缘。 ●二战期间&#xff0c;美国雇佣了1万名女性作为“密码女孩”来破译日本人和德国人发送的密信。 ●英国同样雇用了7000多名女性在英国密码分析中心工作&#xff0c;约占全部工作人员的四分之三。 ●世界上的第一…

108.游戏安全项目:信息显示二-剑侠情缘基址分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信…