select函数是跨平台的IO多路复用函数。
他的基本思想是委托内核监听读写事件,
这个函数有一个有趣的地方在于用到了一个fd_set的结构体。
每次调用selete函数,会改变这个fd_set.
然后要去遍历这个fd_set 处理IO请求。
每次while的时候还要将这个fd_set重新赋值。
下面这段程序,要selete函数来测试控制台的输入。
这里只有一个IO对象需要监听,比较特殊。
#include<stdio.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/select.h>
#define BUF_SIZE 30
int main()
{
fd_set reads, temp;
FD_ZERO(&reads);
FD_SET(0, &reads); // 0 is standard input()
struct timeval timeout;
char buf[BUF_SIZE];
while(1){
temp = reads;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
int result = select(1, &temp,0,0,&timeout);
if(result==-1){
puts("select() error!");
break;
}
else if(result==0){
puts("Time-out!");
}
else{
if(FD_ISSET(0,&temp)){
int str_len = read(0, buf, BUF_SIZE);
buf[str_len] = '\0';
printf("message from console: %s", buf);
}
}
}
return 0;
}