2016-04-17 12 views
0

このプログラムは入力に対して5秒間待機します。入力がない場合は、それが返されます。入力があれば、タイマーを更新してカウントを再開します。select()Whileループでブロックを2回入力したとき

#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); 
} 

通常の入力では正常に動作しますが、2回押すと無限ループになります。どうして?何が起こっている?

+1

'scanf("%[^ \ n]%* c "、buf);'改行を許可しません。 – BLUEPIXY

答えて

1

あなたはそれがタイムアウトを選択した場合、rfds構造はFD_ZERO()が呼び出されたかのよう がリセットされます....

さらに... ...ループ内 をFD_SET(0, &rfds);を配置する必要があり、私がありますFD_SET()を移動しても問題が完全に解決されない場合は(FD_SETを移動する必要があります)、scanf()をより単純なfgets()に変更することをお勧めします。

+0

fgets()を使ってトリックが行われました。しかし何が起こった? –

+0

BLUEPIXYさんのscanf()のコメントを見る – TonyB

関連する問題