为了更清楚地解释我想要做什么,我希望我的代码每隔 2.5 秒(比如说)检查用户是否输入了一些东西(或者如果另一个文件描述符不是 0 有数据要读取),直到程序停止。
如果用户输入了一些东西,一个简单的printf()
会通知他,然后程序将在接下来的 2.5 秒内再次检查用户是否输入了一些东西。
否则,它应该简单地打印时间用完,然后在接下来的 2.5 秒内再次检查用户输入。
这是我从Beej's Guide to Network Programming 中窃取并修改为(尝试)满足我的要求的代码片段:
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define STDIN 0 // file descriptor for standard input
int main(void){
struct timeval tv;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
tv.tv_sec = 2;
tv.tv_usec = 500000;
while(1){
select(STDIN+1, &readfds, NULL, NULL, &tv);
if (FD_ISSET(STDIN, &readfds)){
printf("A key was pressed!\n");
tv.tv_sec = 2;
tv.tv_usec = 500000;
}else{
printf("Timed out.\n");
tv.tv_sec = 2;
tv.tv_usec = 500000;
}
}
return 0;
}
只要我不按任何键,它就可以正常工作并打印“超时”。每 2.5 秒。但是如果我输入一些东西,它似乎会忽略用户输入并继续打印“超时。”。
另一方面,如果我在无限循环中声明andfd_set
,一旦我输入某些内容,就会无限打印出一个键被按下,就好像它忽略了超时一样。struct timeval
我不知道为什么这么简单的代码不起作用。我想我错过了一些我不知道的文件描述符。