IO多路转接 —— 认识select函数

深入理解select函数:参数详解与使用技巧
本文详细介绍了select函数的各个参数及其作用,包括nfds、readfds、writefds、exceptfds和timeout。readfds参数是一个输入输出型的fd_set,用于关注读事件就绪的文件描述符;timeout参数用于设置等待时间,可以是阻塞、非阻塞或混合模式。通过select,可以监控多个文件描述符的读写事件,提高了IO操作的效率。

         目录

1、 第一个参数 nfds

2、 第二个参数 readfds

(1) 第二个参数的作用

(2) 第二个参数的类型

(3) 如何设置 fd_set 类型

(4) 内核最多可以关注多少个fd

3、第三、第四个参数

4、第五个参数 timeout

(1) timeval类型

(2) 第五个参数timeout的作用

(3) 第五个参数timeout的特点

5、函数返回值


一个完整的IO过程 = 等待数据就绪 + 拷贝数据。以recv接口函数为例,recv函数先阻塞等待接收缓冲区里的数据就绪,数据就绪以后再把数据从接收缓冲区拷贝到上层。这里要重点介绍的是等待方式,select模型就是其中一种等待方式,而实现select模型的关键就是select接口函数

select函数其实是在底层不断去轮询检查 fd 是否处于就绪状态,一旦有一个 fd 处于就绪状态,就通知上层。select函数的作用仅仅是负责等待没有所谓的读写功能。下面是select函数的函数声明。

1、 第一个参数 nfds

代表 一组fd中的最大值+1。因为select函数每次可以检测多个 fd 是否有读写事件就绪,而这里的nfds就代表这些 fd 中的最大值max_fd + 1。

加1的原因是,select底层是通过 for循环: for(int i=0;i < nfds;i++)  轮询检测的,这里用的 '<' 而并非 '≤',所以 i 最大可以是 max_fd

2、 第二个参数 readfds

(1) 第二个参数的作用

我们在使用select函数的时候,一是希望select函数可以帮我们关注一批fd的读事件是否就绪;二是如果有哪个 fd 的读事件就绪,希望select函数可以反馈给我。第二个参数就起到这个作用。

(2) 第二个参数的类型

这是一个输入输出型参数,参数类型是 fd_set 是位图类型,可以看作是 fd 集合。输入的时候,假设你希望内核帮你关注 fd = 0 、1、2的读事件就绪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值