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

server/2024/11/25 8:15:23/

系统提供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采用位图,用户->内核,内核->用户,来回的进行数据拷贝(拷贝成本)


http://www.ppmy.cn/server/144744.html

相关文章

vue 的生命周期函数

Vue 生命周期函数&#xff08;生命周期钩子&#xff09;是 Vue 实例从创建到销毁过程中&#xff0c;不同阶段所触发的特定函数。理解这些生命周期函数对于开发 Vue 应用至关重要&#xff0c;因为它们让你在不同的生命周期阶段执行代码&#xff0c;比如数据初始化、DOM 渲染完成…

深度强化学习(RL)介绍

深度强化学习&#xff08;RL&#xff09;介绍 写到了一半&#xff0c;图待后补 一、强化学习概述 &#xff08;一&#xff09;与监督学习对比及定义 强化学习不同于监督学习&#xff0c;在一些任务中数据标注困难&#xff0c;但机器可通过环境反馈知道结果好坏。强化学习是机…

【C++笔记】数据结构进阶之二叉搜索树(BSTree)

【C笔记】数据结构进阶之二叉搜索树(BSTree) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】数据结构进阶之二叉搜索树(BSTree)前言一.二叉搜索树的概念二.二叉搜索树的性能分析三.二叉搜索树的实现3.1二叉树的中序…

删除maven仓库中的失败文件

删除maven仓库中的失败文件 创建一个 删除maven仓库中的失败文件.bit 文件,将下面内容复制进去就行 @echo off rem create by sunhao(sunhao.java@gmail.com) rem crazy coderrem 这里写你的仓库路径 set REPOSITORY_PATH=C:\Users\Administrator\.m2\repository rem 正在搜索.…

嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)

引言&#xff1a;在我们的日常使用中&#xff0c;MOS就是个纯粹的电子开关&#xff0c;虽然MOS管也有放大作用&#xff0c;但是几乎用不到&#xff0c;只用它的开关作用&#xff0c;一般的电机驱动&#xff0c;开关电源&#xff0c;逆变器等大功率设备&#xff0c;全部使用MOS管…

【第三章】Python基础字节序列之编码、解码,ASCII与初始化

字节序列 Python3 引入两个新的类型bytes、bytearray。 bytes不可变字节序列&#xff1b;bytearray是可变字节数组。 编码与解码 编码&#xff1a;str > bytes&#xff0c;将字符串这个字符序列使用指定字符集encode编码为一个个字节组成的序列 bytes, str是python中使用…

哪个牌子猫用空气净化器好?质量好的猫用空气净化器推荐

哪个牌子猫用宠物空气净化器好&#xff1f;冬天一关窗户就家里下起了猫毛雨&#xff0c;谁叫我养了只掉毛猫&#xff0c;真是无法呼吸。养猫人真的太不容易了。后面我男朋友挑了好久&#xff0c;终于挑到一款实用的养猫家电好物。这回真不是智商税&#xff0c;过敏皮炎患者&…

el-table :span-method 合并单元格(2.0)

2024.11.23今天我学习了如何使用el-table组件的合并单元格方法&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <template><div class"container"><el-table :data"table_data" :span-method"object_merge" border>&…