原型:
int select(int max fdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
功能:
委托内核检查描述符集是否准备好(即可以使用)
参数:
fdp1:最大的fd加1,在三个描述符集(readfds、writefds、wxceptfds)中找出最大的描述符,然后再加1
readfds、writefds、wxceptfds:指向描述符集的指针。这三个描述符集说明了我们关心的可读、可写、或处于异常条件的各个描述符。
timeout:指定等待时间
NULL:永远等待,直到捕捉到信号或文件描述符已经准备好
具体值:具体等待的时间,若等到超时且描述符集中的文件描述符还没有准备好,就立即返回。
0:不等待,测试所有指定的描述符并立即返回(不能等到其准备好)
返回值:
> 0:准备好的文件描述符
=0:超时了
< 0(-1):出错
传入select的参数是告诉内核:
我们所关心的描述符;
对于每个描述符我们所关心的条件(是否可读/可写一个给定的描述符、是否关心一个描述符的异常条件);
希望等待的时间。
从select返回时内核告诉我们:
已准备好的描述符数量;
哪一个文件描述符已准备好读、写或异常条件;
select函数确定的可用的文件描述符是非阻塞的读写。
对文件描述符处理的宏:
FD_ZERO(fd_set * set); 清除一个文件描述符集
FD_SET(int fd, fd_set * set); 将一个文件描述符加入到文件描述符集中
FD_CLR(int fd, fd_set * set); 将一个文件描述符从文件描述符集中清除
FD_LSSET(int fd, fd_set *set); 测试fd这个文件描述符在文件描述符集中是否可用
在使用select函数前,先使用FD_SERO和FD_SET来初始化文件描述符集;
在使用select函数时,可循环使用FD_LSSET测试准备好的文件描述符中的某个文件描述符是否可用。
执行完对相关的文件描述符的操作后,用FD_CLR来清除文件描述符