next up previous
次へ: サンプルプログラム 上へ: ioctlを使ったプログラム 戻る: ローカル・モード・フラグ

ioctlのコマンドcmd

フラグ(c_lflag)のECHOをリセットし、ECHONLをセットしたら このフラグをターミナルに設定しなければならない。ターミナルを制御する コマンドはヘッダーファイルの/usr/include/asm/ioctls.hのなかに ある。

#define TCGETS     0x5401
#define TCSETS     0x5402
#define TCSETSW    0x5403
#define TCSETSF    0x5404
#define TCGETA     0x5405 <-- これ
#define TCSETA     0x5406
#define TCSETAW    0x5407
#define TCSETAF    0x5408 <-- これ
#define TCSBRK     0x5409
#define TCXONC     0x540A
#define TCFLSH     0x540B
          .
          .
          .

ターミナルにフラグを設定するコマンドはTCSETAFである。 ECHOをリセットし、ECHONLをセットするフラグをターミナルに 設定して、そのままプログラムを終了すると、ターミナルの状態(属性) は変ったままになってしまう。

それを避けるには、ターミナルの最初の状態(属性)を読み取って、それを保存しておき、 プログラムの終了前にそれを再設定して最初の状態(属性)に戻せばよい。 ターミナルの属性を読み取るコマンドはTCGETAである。

ターミナルの最初の状態を読み取って、保存する処理は次のようになる。 ただし、termio構造体型の変数をtty、保存用の変数を tty_saveとした。なお、ターミナルのファイルデスクリプタ は、標準入力のばあい、0に決められている。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}struct termio tty, tty_save;ioctl(0, TCGETA, &tty);
tty_save = tty;\end{verbatim}\end{boxedminipage}

プログラムの終了前に最初の状態に戻す処理は次のようになる。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}ioctl(0, TCSETAF, &tty_save);\end{verbatim}\end{boxedminipage}

また、ECHOをリセットし、ECHONLをセットするフラグをターミナルに 設定する処理は次のようになる。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}tty.c_lflag ^= ECHO;
tty.c_lflag \vert= ECHONL;ioctl(0, TCSETAF, &tty);\end{verbatim}\end{boxedminipage}



MANOME Yoichi 平成18年12月25日