网上很多资料,大部分写的不准确,看过源码才知道
/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */
#define __NFDBITS (8 * (int) sizeof (__fd_mask))
#define __FD_ELT(d) ((d) / __NFDBITS)
#define __FD_MASK(d) ((__fd_mask) (1UL << ((d) % __NFDBITS)))
/* fd_set for select and pselect. */
typedef struct
{
__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
} fd_set;
/* Maximum number of file descriptors in `fd_set'. */
#define FD_SETSIZE __FD_SETSIZE
typedef __fd_mask fd_mask;
定义精简如上,其中,__FD_SETSIZE=1024,#define __NFDBITS (8 * (int) sizeof (__fd_mask)),sizeof (__fd_mask)=8,所以__NFDBITS=64。所以,最后在我的系统中fd_set的结构就是这样
typedef struct
{
long fds_bits[16];
} fd_set;
所以,fd_set是一个long数组,其总长为1024位。
所以它最多能监控1024个socket。
它是按socket的值置对应位的,可想而知,socket的值也只能小于1023,不然就溢出了。