IO多路转接之select

github链接:通过代码讲解select
此代码先将数组初始化为-1,在使用FD_ISSET将事件全部设为读事件,一旦发现有连接发起请求,那么读事件就绪,将该监听套接字fd添加到数组中,最后每次去遍历这个数组,如果不为-1,那么就有关心的事件,然后在使用FD_ISSET检测是否关心读事件还是其他事件,如果为真,执行本次读任务。
注:是否为读事件,通过FD_ISSET函数去查看,被保存在了一个位图中,位图的下标代表哪些文件描述符,位图下标的内容代表关心哪种事件。

这里写图片描述

一、select

1.使用select函数,可以实现多路复用,程序会停在select这里进行等待,直到被监视的文件描述符一个或多个发生了改变。

#include <sys/select.h>

int select(int nfds,fd_set *reads,fd_set *writefds,fd_set *exceptfds \
,struct timeval *timeout)
//参数告诉内核,我们所关心的描述符,以及对于每个描述符我们所关心的条件。
//愿意等多长时间。
//timeout:1)NULL一直被阻塞,2)0检测完状态立即返回,3)等待特定的时间.

2.fd_set结构
其实这个结构就是一个整数数组,相当于一个位图,使用位图的位表示需要监视的文件描述符,系统提供了以下四个接口,方便操作位图位图的下标代表某个文件描述符,位图的内容代表关心哪种事件。
这里写图片描述
3.select就绪的条件
读就绪
1)socket内核中,接收缓冲区的字节数大于等于低水位标记
2)socketTCP通信中,对端关闭连接,socket读,则返回0。
3)监听的socket上有新的连接请求。
4)socket上有未处理的错误。

写就绪
1)socket内核中,发送缓冲区的字节数大于等于低水位标记
2)socket写操作被关闭
3)socket使用非阻塞connect连接成功或失败
4)socket上有未读取的错误。

4.特点
1)select可监控的文件描述符是受限制的,每个服务器sizeof(fd_set)的大小是不同的,假如是512个字节,那么一次性可监控的文件描述符的个数是512*8=4096个
2)我们先设置一个读事件,并对其进行初始化。在创建一个数组,用于保存放到select监控集中的fd。
3)缺点也是很明显的,它支持的文件描述符数量太少,而且每次调用select,都需要把fd集合从用户态拷贝到内核态,时间开销大,还需要进行遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值