1、函数介绍
系统调用select()提供轮询等待的方式,从多个文件描述符中获取状态变化后的情况。该函数声明如下:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
此函数第2,3,4三个参数类型都是fd_set*,即文件描述符类型,类似于信号集合的概念,即多个文件描述符一起),具体如下所示:
- readfds,包含所有可能因状态改变成可读而触发select()函数返回的文件描述符。
- writefds,包含所有可能因状态变成可写而触发select()函数返回的文件描述符。
- exceptfds,包含所有可能因状态发生特殊异常,如带外数据到来,而触发select()函数返回的文件描述符。
第一个参数限制以上要检测的文件描述符的范围。测试范围再0到最大文件描述符之间,因此,这个参数值为最大文件描述符值-1.
最后一个参数timeout标识阻塞超时时限,其类型是struct timeval*。
在之际应用可以针对select函数的返回值进行选择性执行处理。
- 如果函数执行错误,将返回-1.
- 如果因超时而返回,即再timeout所描述的时间范围内没有任何文件描述符有需要的操作,则返回0,并且将该时间结构体清空为0.
- 如果因一个或多个文件描述符需要处理而返回,其返回值为产生异常的文件描述符数量,并在相应文件描述符集合中清除那些不需要处理的文件描述符,因此返回后,可以根据文件描述符集合的记录值判断哪些文件描述符需要处理