代码和知识有引用自 高性能服务器开发
select系统调用:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写、异常事件
select 函数API如下
int select(int nfds, fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
参数含义:
nfds 被监听的文件描述符总数,通常被设置为select监听的所有文件描述符中的最大值加1(因为文件描述符是从0开始的)
readfds、writefds、exceptfds 对应需要监听的可读、可写、异常事件的fd集合
timeout select函数超时时间,不设置的话select函数会一直阻塞等待事件发生
其中readfds、writefds、exceptfds都为同个结构体fd_set,定义在/usr/include/sys/select.h中
/usr/include/bits/typesizes.h
#define __FD_SETSIZE 1024
/* The fd_set member is required to be an array of longs. */
typedef long int __fd_mask;
/* 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) 1 << ((d) % __NFDBITS))
/* fd_set for select and pselect. */
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;
/* Maximum number of file descriptors in `fd_set'. */
#define FD_SETSIZE __FD_SETSIZE
由此可见,fd_set就只有一个整型数组,该数组的每一位(bit)标记一个文件描述符。fd_set可以容纳的文件描