nfds 需要监听最大的文件描述符+1 (即共监听文件描述符个数)
readset 可读文件描述符集合
writeset 可写文件描述符集合
exceptset 异常文件描述符集合
timeout 在此时间段内,监听的描述符没有时间发生,则函数返回0; timeout=NULL(阻塞:select将一直被阻塞,直到某个文件描述符上发生了事件) timeout所指向的结构设为非零时间(等待固定时间:如果在指定的时间段里有事件发生或者时间耗尽,函数均返回) timeout所指向的结构,时间设为0(非阻塞:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生)
fd_set类型的操作宏函数
//将指定文件描述符集合清空 void FD_ZERO(fd_set *set); //在文件描述符集合中增加一个新的文件描述符 void FD_SET(int fd, fd_set *set); //在文件描述符集合中删除一个文件描述符 void FD_CLR(int fd, fd_set *set); //测试这个文件描述符是否在该文件描述符集合中 int FD_ISSET(int fd, fd_set *set);之前 fd_set只用32位的位图,因此最多只能包含32个文件描述符 现在 fd_set使用1024位的位图,因此最多能包含1024个文件描述符
通常在头文件<sys/select.h>中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量
在/usr/include/select.h 中 fd_set为如下结构
typedef struct { #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_mask 是这样被定义的
typedef long int __fd_mask;__FD_SETSIZE宏在posix_types.h被定义为
#define __FD_SETSIZE 1024__NFDBITS在select.h中被定义为
#define __NFDBITS (8 * (int) sizeof (__fd_mask))假设:long int 32位 __NFDBITS = 8*(4字节)=32位 __FD_SETSIZE / __NFDBITS 得到的结果即为:1024位需要多少个__fd_mask组成 因此即可得到结论,在fd_set节后中定义了一个1024位的一个数据结构(由多个元素的__fd_mask类型的数组构成)。