IO多路复用之select详解

本文详细介绍了IO多路复用技术中的select模型,包括其在Windows和Linux下的用途、接口定义、源码解析以及使用示例。select允许一次性检查多个文件描述符的可读写状态,尽管在处理大量文件描述符时性能下降,但在跨平台应用中仍具有实用性。
摘要由CSDN通过智能技术生成
一、select用途

select是IO多路复用模型中的一种,属于标准的IO多路复用,在Windows、Linux下都可以使用。IO多路复用同时监听多个IO,一次系统调用判定所有IO的可读写状态,会一直阻塞或者指定一个超时时间,直到一个或多个文件描述符集合称为就绪态。select避免了多次的系统调用和阻塞,但不适合文件数量庞大、IO流量频繁的时候,会随着fd的数量增大性能下降明显。

二、接口定义

windows定义

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

linux定义

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

其他fd_set操作接口

FD_CLR(inr fd,fd_set* set);将描述符fd从fdset所指向的集合中移除
FD_SET(int fd,fd_set*set);将描述符fd添加到fdset所指向的集合中
FD_ZERO(fd_set *set); 将fdset指向的集合初始化为空
FD_ISSET(int fd,fd_set *set);测试描述词组set中相关fd 的位是否为真

select参数详解:

nfds:select中监视的文件句柄数,一般设为要监视的文件中的最大文件号加一。
readfds:检测读是否就绪的文件描述符集合
writefds :检测写是否就绪的文件描述符集合
exceptfds:检测异常情况是否发生的文件描述符集合
(1、信包模式下伪终端主设备上从设备状态发生改变;2、流式套接字接收到了带外数据)
timeout: 设为NULL,等待直到某个文件描述符发生变化;设为00毫秒,不等待直接返回;
设为大于0的值,有描述符变化或超时时间到才返回。
select返回值:负数表示有错误发生;大于等于0,表示有n个描述符就绪。具体是哪个,
还需要用FD_ISSET遍历判定。
三、windows的select源码
int select(int nfds, fd_set *readfds, fd_set *writefds, 
fd_set *exceptfds, const struct timeval *timeout)

#ifndef FD_SETSIZE
#define FD_SETSIZE      64
#endif /* FD_SETSIZE */
typedef struct fd_set {
   
        unsigned int fd_count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值