当我按Enter两次时,select()在While循环中阻塞

时间:2016-04-17 02:21:00

标签: c

所以,我希望这个程序等待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);
}

它可以正常输入,但是当我按两次输入时,它会进入无限循环。为什么?怎么了?

1 个答案:

答案 0 :(得分:1)

您需要将FD_SET(0, &rfds);放在循环中... ...如果选择超时,rfds结构将被重置 好像FD_ZERO()已被召唤....

此外,如果移动scanf()并未完全解决您的问题,我建议您将fgets()更改为更简单的FD_SET()(无论如何FD_SET需要移动。)