6

一度に1バイトずつ読み取って、すべてのユーザー入力をキャプチャする方法は?

このコーディングを行いましたが、機能しません

if ((fd = open("/dev/char", O_RDONLY) != 1) {
    tty = open("/dev/tty", O_RDONLY);
    tcsetattr(0, TCSANOW, &orig_info);
    read (fd, &buf, sizeof(char));
}
close(fd);

端末が入力を待つことを期待していましたが、そうではありませんでした。

4

2 に答える 2

11

キーボード デバイス自体は、 のエントリの 1 つです/dev/input。では、キーボードやその他の入力デバイスを接続タイプ (PS/2、USB など) で見つけることができます/dev/input/by-path。明らかに、ハードウェアに直接アクセスするには root として実行する必要があります。また、キーボードからの raw バイトをキーの押下やキーの解放などに独自に変換する必要があります。これはおそらくあなたが望むものではありません。

GUI アプリケーションを実行している場合、低レベルの方法はXNextEvent、同じファミリーの他の関数を呼び出すことです。修飾子を適用するのはアプリケーション次第であるため、入力イベントのデコードは完全に簡単ではありません。GUI フレームワーク (Motif、Gtk、Qt など) が役に立ちます。

端末アプリケーションを実行している場合は、標準入力または/dev/tty(/dev/ttyは、標準入力がリダイレクトされている場合でも、常にプログラムが実行されている端末です) から読み取ります。端末をraw モードにする必要があります。デコードされた文字キーとファンクション キーはほとんどがエスケープ シーケンスとして取得されます。ここでもライブラリが役に立ちます。事実上の標準はncursesです。

于 2013-04-08T00:37:06.830 に答える
1

正確に何をしたいですか?

あなたが探しているものが端末のバッファリングされていない入力である場合、それはtcsetattr()あなたが探しているものです-端末を非標準モードにする必要があります。つまり、端末フラグを含まないように設定しますICANON-たとえば、このコードスニペットを参照してください。man termios(または関数名、通常は Linux の同じ man ページにリンクしています) を参照してください。

キーボードに排他的にアクセスしたい場合は、はるかに複雑です。

于 2013-04-07T23:00:53.683 に答える