系统:centos 7 64位
select 中的fd_set
fd_set结构体定义在这:
typedef struct
{
/* XPG4.2 requires this member name. Otherwise avoid the name
from the global namespace. */
#ifdef __USE_XOPEN
__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
# define __FDS_BITS(set) ((set)->fds_bits)
#else
__fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS];
# define __FDS_BITS(set) ((set)->__fds_bits)
#endif
} fd_set;
fd在内核中存储在fd_set,fd_set是包含一个大小为 16 ( __FD_SETSIZE / __NFDBITS)的数组;数组成员 long int(8B=64b);
int main()
{
fd_set fdset;
FD_ZERO(&fdset);
for (int i=0; i<16; i++){
FD_SET(i*64, &fdset);
}
debug("NFDBITS = %d", NFDBITS);
debug("FD_SETSIZE = %d", FD_SETSIZE);
for (int i=0; i< FD_SETSIZE/ NFDBITS; i++){
debug("fdset[%d] = %lu",i, fdset.fds_bits[i]);
}
return 0;
}
打印FD_SETSIZE我们就可以知道select支持的最大FD,输出如下
/tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00024]: NFDBITS = 64
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00025]: FD_SETSIZE = 1024
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[0] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[1] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[2] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[3] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[4] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[5] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[6] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[7] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[8] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[9] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[10] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[11] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[12] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[13] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[14] = 1
[file: /tmp/tmp.J5IiMTfNfM/main.cpp, func: main ,Line: 00028]: fdset[15] = 1
从打印可以知道最大支持fd 是1024,基于下面定义的FD操作,fd_set 被抽象为长度为1024的比特串。
#define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)
#define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp)
#define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp)
#define FD_ZERO(fdsetp) __FD_ZERO (fdsetp)