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

一 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)

你可能感兴趣的:(C++,UNIX网络编程)