0

私がやりたいことをより明確に説明するために、ユーザーが何かを入力したかどうか (または 0 以外のファイル記述子に読み取るデータがあるかどうか) を 2.5 秒ごとに (たとえば) プログラムが停止するまでチェックするようにコードを作成します。

ユーザーが何かを入力すると、簡単printf()に通知され、プログラムは次の 2.5 秒以内にユーザーが何かを入力したかどうかを再度確認します。

それ以外の場合は、時間がなくなったことを単に出力し、次の 2.5 秒でユーザー入力を再度チェックする必要があります。

そして、Beej の 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;
}

キーを押さない限り、これは正常に機能し、「Timed out」と表示されます。2.5秒ごと。しかし、何かを入力すると、ユーザー入力が無視され、「Timed out.」と出力され続けるようです

一方、無限ループfd_setで and を宣言すると、何かを入力すると、タイムアウトを無視するかのように、キーが押されたことが無限に出力されます。struct timeval

このような単純なコードが機能しない理由がわかりません。私が知らないファイル記述子について、いくつかの点が欠けていると思います。

4

1 に答える 1