int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
函数的最后一个参数timeout显然是一个超时时间值,其类型是struct timeval *,即一个struct timeval结构的变量的指针,所以我们在程序里要申明一个struct timeval tv;然后把变量tv的地址&tv传递给select函数。struct timeval结构如下:
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
第2、3、4三个参数是一样的类型: fd_set *,即我们在程序里要申明几个fd_set类型的变量,比如rdfds, wtfds, exfds,然后把这个变量的地址&rdfds, &wtfds, &exfds 传递给select函数。这三个参数都是一个句柄的集合,第一个rdfds是用来保存这样的句柄的:当句柄的状态变成可读的时系统就会告诉select函数返回,同理第二个wtfds是指有句柄状态变成可写的时系统就会告诉select函数返回,同理第三个参数exfds是特殊情况,即句柄上有特殊情况发生时系统会告诉select函数返回。
#include
#include
#include
#include
#include
#define ENABLE_TIMEOUT
int main() {
int ret;
char buf[16];
#ifdef ENABLE_TIMEOUT
fd_set fds;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO,&fds);//把标准输入加入监控
tv.tv_sec = 5;
tv.tv_usec = 0;
//监控标准输入的写集合
ret = select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
if(ret < 0)
{
perror("select");
exit(-1);
}else if(ret == 0)
{//5 秒钟内用户没有按下键
printf("timeout
");
}
else
#endif
{ //读入用户输入
scanf("%14s", buf);
printf("your input %s
",buf);
}
}
阅读(2106) | 评论(1) | 转发(0) |