Unixコンソールでの文字入力の待機

もう一度、Unixコンソールからの文字の読み取りをブロックする問題に遭遇しました。 DOSのもとでBorland Pascalで書く幸運があった人は、おそらくReadKey()押す前にプログラムの実行をブロックするReadKey()関数を覚えているでしょう。 この要件はUnixコンソールにも数回現れましたが、 getchar()関数はEnterが押されるまで実行をブロックします。これは場合によってはあまり望ましくありません。

 #include <stdio.h> #include <termios.h> #include <unistd.h> int main() { struct termios term; tcgetattr(STDIN_FILENO, &term); term.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, 0, &term); if (getchar()) { printf(«Hello world!»); } return 0; } 

端末のパラメータを記述するtermios構造のアプローチのすべての塩。 c_lflagフィールドc_lflag 、いわゆるローカルオプション、つまり 入力文字がドライバーによってどのように処理されるかについて。

この場合の敵はICANONビットです。これは、標準入力モードまたは非標準(生)入力モードの選択を担当します。 stdinの標準モードstdinデフォルトで設定されており、特にラインバッファー、つまり getchar()をフィードするたびにEnterを押すという要件。 したがって、 stdinを非stdinモードに移行する必要があります。

同じtermiosフィールドのECHOビットは、入力エコー、つまりこの場合、画面上の入力文字の表示を担当します。 取り除いて/味に残します。


Source: https://habr.com/ru/post/J15997/


All Articles