1.select函数
select函数原型如下:
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);
(1)参数maxfdp是一个整数值,是指集合中所有文件描述符的范围,其值为所有文件描述符的最大值加1。
(2)参数timeout是select的超时时间,这个参数至关重要,它可以使select处于3种状态:若传入参数timeout=NULL,那么select将处于阻塞态,直到监视到文件描述符集合中某个描述符变化为止;如果将参数timeout=0,则select将处于非阻塞状态,不管文件是否变化,有变化返回一个正值,无变化返回0;如果将参数timeout设置为大于0,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,超时返回0,有变化返回一个正值。
(3)readfds,writefds和errorfds表示分别指向fd_set 描述符集合的指针,分别监视描述符集合中描述符的读,写和异常变化。
fd_set 结构可以理解为一个fd的集合,其宏定义的控制函数如下所示:
fd_set set;
FD_ZERO(&set); /*将set清零*/
FD_SET(fd, &set); /*将fd加入set */
FD_CLR(fd, &set); /*将fd从set中清除*/
FD_ISSET;/*如果fd在set中则真,函数返回时,在set中的为变化描述符*/
例子程序:
使用select循环读取键盘输入: