当前位置: 首页 > news >正文

【计算机网络】多路转接之select

系统提供select()来实现多路转接

IO = 等 + 拷贝 -> select()只负责等待,可以一次等待多个fd

select()本身没有数据拷贝的能力,拷贝要read()/write()来完成

一、select的使用

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


① int nfds:select要监视多个fd中的最大的fd+1(比如要监视3,4,5 那nfds就是5+1=6)


fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout 这四个参数都是输入输出型参数

② struct timeval *timeout

设为nullptr -> 阻塞式监视;设为struct timbal timeout = {0, 0} -> 非阻塞式监视

设为struct timbal timeout = {5, 0} -> 5s以内阻塞式,超过5s,非阻塞返回一次(每隔5s返回一次)

假设到第3s时就返回了,那struct timbal timeout作为输出型参数就返回剩余时间2s(5-3=2)

返回值:ret>0:返回有几个fd就绪了;ret==0:超时返回了;ret<0:select调用失败


fd_set *readfds(读事件)  fd_set *writefds(写事件)  ⑤fd_set *exceptfds(异常事件)

select未来只关心三类事件:a. 读 b.写 c.异常 — 对于任何一个fd,都是这三种

fd_set:位图结构,表示文件描述符集合

输入:表示用户告诉内核,你要帮我关心一下,我给你的集合中的所有的fd的读事件(哪些fd上的读事件内核要关心)

比特位的位置,表示fd的数值;比特位的内容,表示是否关心

输出:内核告诉用户,你说要关心的多个fd中,有哪些已经就绪了

比特位的位置,表示fd的数值;比特位的内容,表示哪些fd所对应的事件已经就绪了

输入输出型参数的意义:让用户和内核之间互相沟通,互相知晓对方想要的或者关心的(这三个参数分别对应三类事件)


我们不能直接操作fd_set位图,系统提供了专门的接口去操作fd_set位图

void FD_CLR(int fd, fd_set *set); // 删除fd_set位图中的fd

int  FD_ISSET(int fd, fd_set *set); // 检测fd_set位图中是否存在fd

void FD_SET(int fd, fd_set *set); // 把fd设置进fd_set位图

void FD_ZERO(fd_set *set); // 清空fd_set位图

注意⚠️:能够添加的fd的个数一定是有上限的(1024个)

二、select的特点

1.select能同时等待的文件fd是有上限的,除非重新改内核,否则无法解决

2.必须借助第三方数组,来维护合法的fd

3.select的大部分参数是输入输出型的。调用select前,要重新设置所有的fd;调用之后,我们还有检查更新所有的fd(遍历成本)

4.select为什么第一个参数是最大fd+1呢?确定遍历范围 — 内核层面

5.select采用位图,用户->内核,内核->用户,来回的进行数据拷贝(拷贝成本)

相关文章:

【计算机网络】多路转接之select

系统提供select()来实现多路转接 IO 等 拷贝 -> select()只负责等待&#xff0c;可以一次等待多个fd select()本身没有数据拷贝的能力&#xff0c;拷贝要read()/write()来完成 一、select的使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…...

数据库-基础理论

文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论&#xff08;Failure Mode and Effects Analysis&#xff09;七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…...

Linux——1_系统的延迟任务及定时任务

系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的&#xff0c;不会重复执行 当延迟任务产生输出后&#xff0c;这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…...

C++ 矩阵旋转

【问题描述】 编写一个程序&#xff0c;读入一个矩阵&#xff0c;输出该矩阵以第一行第一列数字为中心&#xff0c;顺时针旋转90度后的新矩阵&#xff0c;例如&#xff1a; 输入的矩阵为: 1 2 3 4 5 6 顺时针旋转90度后输出的矩阵为&#xff1a; 4 1 5 2 6 3 【输入…...

Docker学习笔记整理

这周不知道写点啥内容做个分享&#xff0c;但还是秉持学会分享的精神&#xff0c;粗略放一些Docker相关的问题和解答吧&#xff0c;后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案&#xff08;资源完全隔离&#xff09;,有以下缺…...

计算机组成原理期末试题三(含答案)

本科生期末试卷 三 一&#xff0e;选择题&#xff08;每小题1分&#xff0c;共10分&#xff09; 1&#xff0e;冯诺依曼机工作的基本方式的特点是______。 A 多指令流单数据流 B 按地址访问并顺序执行指令 C 堆栈操作 D 存贮器按内容选择地址 2&#xff0e;在机器数______中&a…...

django+boostrap实现注册

一、django介绍 Django 是一个高级的 Python 网络框架&#xff0c;可以快速开发安全和可维护的网站。由经验丰富的开发者构建&#xff0c;Django 负责处理网站开发中麻烦的部分&#xff0c;因此你可以专注于编写应用程序&#xff0c;而无需重新开发。 它是免费和开源的&#x…...

C++初阶——类和对象(下)

目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值&#xff0c;还有一种方式——初始化列表&#xff0c; 初始化列…...

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟&#xff0c;不少企业在开展私有化容器平台建设时&#xff0c;首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器&#xff1f;在往期“虚拟化 vs. 裸金属*”系列文章中&#xff0c;我们分别对比了容器部署在虚拟化平台和物理机上的架…...

idea初始化设置

下载idea&#xff1a; https://www.jetbrains.com/idea/ 安装idea 安装插件&#xff1a; Rainbow BracketsLombokMybatisXSonarLintMaven HelperCodeGeeX&#xff08;国内AI插件可用&#xff09; 设置idea注释模板&#xff1a; 设置代码注释模板&#xff1a; https://blo…...

LINUX系统编程之——环境变量

目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1&#xff09;不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…...

健康老龄化:适合老年人的播客

什么是播客 什么是播客&#xff1f;好问题。对于那些还不熟悉这个术语的人来说&#xff0c;播客有点像在线广播或电视节目。这是一个可下载、可流式传输的程序&#xff0c;定期发布剧集&#xff0c;时长从几分钟到一个多小时不等。您可以在计算机、智能手机或平板电脑上…...

家庭智慧工程师:如何通过科技提升家居生活质量

在今天的数字化时代&#xff0c;家居生活已经不再只是简单的“住”的地方。随着物联网&#xff08;IoT&#xff09;、人工智能&#xff08;AI&#xff09;以及自动化技术的快速发展&#xff0c;越来越多的家庭开始拥抱智慧家居技术&#xff0c;将他们的家变得更加智能化、便捷和…...

Milvus概念

非结构化数据、嵌入和 Milvus 非结构化数据&#xff08;如文本、图像、音频&#xff09;格式多样&#xff0c;蕴含丰富的语义信息&#xff0c;使其分析变得复杂。为了管理这种复杂性&#xff0c;嵌入技术被用来将非结构化数据转换为数值向量&#xff0c;这些向量能够捕捉数据的…...

为什么调用 setState 而不是直接改变 state

在React中&#xff0c;调用setState方法而不是直接改变state的原因涉及多个方面&#xff0c;包括性能优化、状态管理的可预测性、React的设计理念等。以下是对这些原因的详细解释&#xff1a; 1. 性能优化 异步更新与批量处理&#xff1a;setState是异步执行的&#xff0c;Rea…...

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…...

cocos creator 3.8 物理碰撞器Collider+刚体RigidBody 8

遇到一个朋友&#xff0c;你来就行的朋友&#xff0c;我过去了&#xff0c;管吃管住&#xff0c;这样的朋友真的很难求。 最近离职了&#xff0c;很难想象&#xff0c;一份策划书一天能给你改n次&#xff0c;一周能郁闷&#xff0c;上一个功能没搞完&#xff0c;让你搞下一个功…...

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…...

算法模板1:排序+二分+高精度+前缀+差分

文章目录 1.1 排序STL sort函数快速排序算法模板归并排序算法模板 1.2 二分整数二分算法模板浮点数二分算法模板 1.3 高精度高精度加法高精度减法高精度乘低精度高精度除以低精度 1.4 前缀和与差分**一维前缀和****二维前缀和****一维差分****二维差分** 之前整理了好多算法模板…...

SpringBoot实现单文件上传

一、在springBoot项目中的pom.xml添加依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 二、在资源目录下的static目录下中创建一个upload.html的表单文件…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...