termios
termiosは「非同期通信ポートを制御するための汎用ターミナルインタフェース」らしい.端末をclearしたりechoを抑制したり非カノニカルモードにしたりできる.
termiosには,いろんな関数がある.これらの多くは,termios構造体を引数にとり,この構造体のフィールド操作によって端末を制御する.termios構造体は少なくとも以下のフィールドがある.
- tcflags_t c_iflag
- 端末への入力をどうプログラムに渡すかの設定.
- tcflags_t c_oflag
- プログラムからの出力をどう処理するかの設定.
- tcflags_t c_cflag
- 端末のハードウェア的制御の設定.
- tcflags_t c_lflag
- 端末のいろんな制御の設定.
- cc_t c_cc[NCCS]
- 特殊制御文字(EOFとか)の設定.
- tcgetattrで端末の現在の設定を取得.
- 端末の現在の設定のコピーを作成し,フィールドをいろいろ書き換える.
- tcsetattrにあたらしい端末の設定を渡して反映.
- 何かする.
- tcsetattrに最初に取得した端末の設定を渡して端末をもとの状態に戻す.
- TCSANOW
- 変更を即反映
- TCSADRAIN
- 出力がすべて転送された後に反映.出力に影響するパラメータを変更したときに使用.
- TCSAFLUSH
- 出力を全て転送し,受信したが読み込んでいない入力を全て破棄して反映.
termiosについて詳細に書くのは大変なので例を書いてみる.通常は入力をいろいろ編集して納得したらリターンを押してプログラムに入力を渡す(カノニカルモード).が,キーを押した瞬間にプログラムに入力を渡したいこともある(非カノニカルモード).以下は非カノニカルモードで入力を受け取るサンプルである.
実行結果を以下に示す.
$ ./nocanon input = a input = b input = c input = qキーを押したら即input = ?と出て,エコーもない.

