关于IO复用函数select的FD_SETSIZE的正确定义

本文解析了Linux下FD_SETSIZE的定义及其与select机制的关系,指出FD_SETSIZE通常被设定为1024,意味着select能管理的文件描述符最大值不超过1024。通过分析select.h源码,深入探讨了这一限制的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 FD_SETSIZE定义

    首先,FD_SETSIZE的值在linux下一般被定义为1024,意思是select管理的描述符的最大值不能大于1024(1024也不行),参考linux的man page对FD_SET函数的一些提醒:Executing FD_CLR() or FD_SET() with a value of fd that is negative or is equal to or larger than FD_SETSIZE will result in undefined behavior


二 select.h的源码证明

  

/* /usr/include/sys/select.h */
/* 其实就是创建了一个long int位图数组,数组大小就是__FD_SETSIZE / __NFDBITS=64;
所以只能处理FD值小于1024的描述符,否则就数组越界 ,其行为是未定义的*/
typedef long int __fd_mask;
#define __NFDBITS   (8 * (int) sizeof (__fd_mask))
#define __FDELT(d)  ((d) / __NFDBITS)
#define __FDMASK(d) ((__fd_mask) 1 << ((d) % __NFDBITS))
__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
# define __FDS_BITS(set) ((set)->fds_bits)
/* /usr/include/bits/select.h */
#define __FD_SET(d, set)    (__FDS_BITS (set)[__FDELT (d)] |= __FDMASK (d))
#define __FD_CLR(d, set)    (__FDS_BITS (set)[__FDELT (d)] &= ~__FDMASK (d))
#define __FD_ISSET(d, set) \
((__FDS_BITS (set)[__FDELT (d)] & __FDMASK (d)) != 0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值