私がやりたいことをより明確に説明するために、ユーザーが何かを入力したかどうか (または 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
このような単純なコードが機能しない理由がわかりません。私が知らないファイル記述子について、いくつかの点が欠けていると思います。