10

select() を使用してキーボード入力を読み取ろうとしていますが、キーボードから読み取る方法とファイル記述子を使用して読み取る方法がわからないことに行き詰まりました。この問題に対処するために STDIN と STDIN_FILENO を使用するように言われましたが、まだ混乱しています。
どうすればいいですか?

4

3 に答える 3

6

あなたの質問は少し混乱しているように聞こえます。select()入力が利用可能になるまでブロックするために使用されます。ただし、実際の読み取りは通常のファイル読み取り関数 ( readfreadfgetcなど) で行います。

簡単な例を次に示します。stdin が少なくとも 1 文字読み取り可能になるまでブロックします。ただし、もちろん、端末を未調理モードに変更しない限り、入力された文字がファイル バッファーに (端末バッファーから) フラッシュされるときに、Enter キーを押すまでブロックされます。

#include <stdio.h>
#include <sys/select.h>

int main(void) {
    fd_set s_rd, s_wr, s_ex;
    FD_ZERO(&s_rd);
    FD_ZERO(&s_wr);
    FD_ZERO(&s_ex);
    FD_SET(fileno(stdin), &s_rd);
    select(fileno(stdin)+1, &s_rd, &s_wr, &s_ex, NULL);
    return 0;
}
于 2011-06-21T02:36:40.380 に答える
1

おそらく、「WINDOWS」でキーボード入力をのぞく方法が必要ですか? Windows では、STDIN の select() から結果を取得できません。PeekConsoleInput() を使用する必要があります。そして、次のように stdin のハンドルを使用します。

hStdin = CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE, ...

stdin はパイプ入力になる場合があります。その場合、キーボード入力は得られません。

PS Windows について質問していない場合は、申し訳ありません。

于 2011-06-21T03:14:23.417 に答える