36.7. "termios" --- POSIX スタイルの端末制御
********************************************

このモジュールでは端末 I/O 制御のための POSIX 準拠の関数呼び出しインタ
フェースを提供します。これら呼び出しのための完全な記述については、
Unix マニュアルページの *termios(2)* を参照してください。これは POSIX
*termios* 形式の端末制御をサポートしていてインストール時に有効にした
Unix のバージョンでのみ利用可能です。

このモジュールの関数は全て、ファイル記述子 *fd* を最初の引数としてとり
ます。この値は、 "sys.stdin.fileno()" が返すような整数のファイル記述子
でも、 "sys.stdin" 自体のような *file object* でもかまいません。

このモジュールではまた、モジュールで提供されている関数を使う上で必要と
なる全ての定数を定義しています; これらの定数は C の対応する関数と同じ
名前を持っています。これらの端末制御インタフェースを利用する上でのさら
なる情報については、あなたのシステムのドキュメンテーションを参考にして
ください。

このモジュールでは以下の関数を定義しています:

termios.tcgetattr(fd)

   ファイル記述子 *fd* の端末属性を含むリストを返します。その形式は:
   "[iflag, oflag, cflag, lflag, ispeed, ospeed, cc]" です。 *cc* は端
   末特殊文字のリストです (それぞれ長さ 1 の文字列です。ただしインデク
   ス "VMIN" および  "VTIME" の内容は、それらのフィールドが定義されて
   いた場合整数の値となります)。端末設定フラグおよび端末速度の解釈、お
   よび配列 *cc* のインデクス検索は、 "termios" で定義されているシンボ
   ル定数を使って行わなければなりません。

termios.tcsetattr(fd, when, attributes)

   ファイル記述子 *fd* の端末属性を *attributes* から取り出して設定し
   ます。 *attributes* は "tcgetattr()" が返すようなリストです。引数
   *when* は属性がいつ変更されるかを決定します: "TCSANOW" は即時変更を
   行い、 "TCSADRAIN" は現在キューされている出力を全て転送した後に変更
   を行い、 "TCSAFLUSH" は現在キューされている出力を全て転送し、全ての
   キューされている入力を無視した後に変更を行います。

termios.tcsendbreak(fd, duration)

   ファイル記述子 *fd* にブレークを送信します。*duration* をゼロにする
   と、0.25--0.5 秒間のブレークを送信します; *duration* の値がゼロでな
   い場合、その意味はシステム依存です。

termios.tcdrain(fd)

   ファイル記述子 *fd* に書き込まれた全ての出力が転送されるまで待ちま
   す。

termios.tcflush(fd, queue)

   ファイル記述子 *fd* にキューされたデータを無視します。どのキューか
   は *queue* セレクタで指定します: "TCIFLUSH" は入力キュー、
   "TCOFLUSH" は出力キュー、 "TCIOFLUSH" は両方のキューです。

termios.tcflow(fd, action)

   ファイル記述子 *fd* の入力または出力をサスペンドしたりレジュームし
   たりします。引数 *action* は出力をサスペンドする "TCOOFF" 、出力を
   レジュームする "TCOON" 、入力をサスペンドする "TCIOFF" 、入力をレジ
   ュームする "TCION" をとることができます。

参考:

  "tty" モジュール
     一般的な端末制御操作のための便利な関数。


36.7.1. 例
==========

以下はエコーバックを切った状態でパスワード入力を促す関数です。ユーザの
入力に関わらず以前の端末属性を正確に回復するために、二つの
"tcgetattr()" と "try" ... "finally" 文によるテクニックが使われていま
す:

   def getpass(prompt="Password: "):
       import termios, sys
       fd = sys.stdin.fileno()
       old = termios.tcgetattr(fd)
       new = termios.tcgetattr(fd)
       new[3] = new[3] & ~termios.ECHO          # lflags
       try:
           termios.tcsetattr(fd, termios.TCSADRAIN, new)
           passwd = raw_input(prompt)
       finally:
           termios.tcsetattr(fd, termios.TCSADRAIN, old)
       return passwd
