首先,从man手册里找到对select函数的描述,如下:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其中:
nfds : 指集合中所有文件描述符的范围,即所有文件描述符的最大值加1
readfds / writefds : 监控文件读(写)属性,集合中有一个文件可读(写),返回值大于0;否则,根据timeout判断是否超时,若超时,返回值为0;若发生错误返回-1.若值为NULL,表示不关心集合中文件的读(写)属性。
exceptfds : 监视文件异常错误
timeout : 可以使select处于三种状态:
1. NULL:阻塞,直到文件描述符集合中有文件发生变化为止;
2. 0s 0ms: 非阻塞,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
3. 大于0:在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
select : 监控fd集合变化
FD_CLR 在fd集合删除某个fd
FD_ISSET 测试fd集合中的某个fd是否可以读写
FD_SET 向fd集合中添加fd
FD_ZERO 清空fd集合
0 : stdin 1 : stdout 2 : stderr
有了以上关于select的描述,下面附上程序:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/time.h> 4 #include <sys/types.h> 5 #include <unistd.h> 6 7 8 #define STDIN 0 9 10 int main() 11 { 12 //1. 初始化fd集合 13 fd_set fds;//定义fd集合 14 FD_ZERO(&fds);//清空fd集合 15 FD_SET(STDIN,&fds);//添加STDIN 16 //2. 监控fd集合 - 遍历集合方式 17 int ret = select(STDIN+1,&fds,NULL,NULL,NULL); 18 if(ret == -1) 19 { 20 perror("select"); 21 exit(1); 22 } 23 24 //3. 判断STDIN的读属性是否发生变化 25 if(FD_ISSET(STDIN,&fds)) 26 printf("someone input a char! "); 27 28 //4. 清空集合 29 FD_CLR(STDIN,&fds); 30 FD_ZERO(&fds); 31 return 0; 32 }