select
select函数原型如下:
select(int maxfdp,fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout)
fd_set
是一种数据结构,该数据结构中存放着文件描述符,即文件句柄。该数据结构有大小限制,受到内核参数FD_SETSIZE
的影响,一般为1024。该结构可以通过一些宏由人来操控。
fd_set set;
FD_ZERO(&set); //将set清零
FD_SET(fd, &set); //将fd加入set中
FD_CLR(fd, &set); //不再监控fd
FD_ISSET(fd, &set); //fd在set中是否就绪,即是否为1
timeval
是一种用来表示时间值的数据结构,它有两个成员,一个是秒数,另一个是毫秒数。
struct timeval{
long tv_sec;
long tv_usec;
}
select
函数中,maxfdp
要监控的文件描述符的最大值加1。三个fd_set
是文件描述符的集合,它们既代表输入参数,也代表输出参数。
readfds
代表可读的文件描述符集合,作为输入,select
要去检查它每一个为1的位是否可读;作为输出,调用者要使用FD_ISSET
去检查自己关注的句柄是否就绪,即是否为1。其他同理。
timeout
是超时时间,它可以设置为三种状态:
- NULL:代表该函数是阻塞的,只有当有句柄就绪时才返回
- 0:代表函数是非阻塞的,调用即返回
- 大于0:代表超时时间,在超时时间内阻塞,一旦有就绪句柄,立马返回;否则等到超时时间到才返回。
select的返回值是集合中就绪的句柄数目。如果小于0,代表发生错误;如果等于0,代表超时。
这里有一些关于select的小问题ÿ