もう一度、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ビットは、入力エコー、つまりこの場合、画面上の入力文字の表示を担当します。 取り除いて/味に残します。