上一节分析了poll的原理和实现,这节分析它的孪生兄弟select。
先看一下select的函数原型。
man 2 select
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
#undef __FD_SETSIZE
#define __FD_SETSIZE 1024
/*fd_set集合可以通过一些宏由人为来操作,总共1024个bit,即代表select最多可监控1024个文件的状态 */
typedef struct {
unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
} __kernel_fd_set;
typedef __kernel_fd_set fd_set;
void FD_CLR(int fd, fd_set *set); /* 将一个给定的文件描述符从集合中删除*/
int FD_ISSET(int fd, fd_set *set); /* 检查集合中指定的文件描述符是否可以读写 */
void FD_SET(int fd, fd_set *set); /* 将一个给定的文件描述