【计算机网络】多路转接之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采用位图,用户->内核,内核->用户,来回的进行数据拷贝(拷贝成本)

相关推荐
liuhuizuikeai1 分钟前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
王老师青少年编程10 分钟前
csp信奥赛C++高频考点专项训练之字符串 --【子串查找】:[NOIP 2009 提高组] 潜伏者
c++·字符串·csp·高频考点·信奥赛·子串查找·潜伏者
Cyber4K14 分钟前
【Python专项】进阶语法-系统资源监控与数据采集(1)
开发语言·python·php
初願致夕霞18 分钟前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
Le_ee1 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
yong99902 小时前
MATLAB读取高光谱图像
开发语言·matlab
2zcode2 小时前
基于MATLAB的肝病风险评估与分期分析系统设计与实现
开发语言·matlab
小小de风呀2 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
ooseabiscuit2 小时前
Laravel6.x核心优化与特性全解析
android·开发语言·javascript
数智化精益手记局2 小时前
什么是设备维护管理?设备维护管理包含哪些内容?
大数据·网络·人工智能·安全·信息可视化