所以,我希望这个程序等待5秒钟输入。如果没有输入则返回。如果有输入,它会更新计时器并再次开始计数。
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
char buf[1024];
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
do {
tv.tv_sec = 5;
tv.tv_usec = 0;
printf("Please enter a number: \n");
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1)
perror("select()");
else if (retval) {
scanf("%[^\n]%*c", buf);
}
else
printf("No data within five seconds.\n");
} while (tv.tv_sec != 0 && tv.tv_usec != 0);
exit(EXIT_SUCCESS);
}
它可以正常输入,但是当我按两次输入时,它会进入无限循环。为什么?怎么了?
答案 0 :(得分:1)
您需要将FD_SET(0, &rfds);
放在循环中...
...如果选择超时,rfds
结构将被重置
好像FD_ZERO()
已被召唤....
此外,如果移动scanf()
并未完全解决您的问题,我建议您将fgets()
更改为更简单的FD_SET()
(无论如何FD_SET
需要移动。)