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



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




All Articles