Scroll to navigation

TERMIOS(3) Linux Programmer's Manual TERMIOS(3)

名前

termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed - ターミナル属性の取得・設定、ライン制御、ボーレートの取得・設定

書式

#include <termios.h>

#include <unistd.h> int tcgetattr(int fd, struct termios *termios_p); int tcsetattr(int fd, int optional_actions, const struct termios *termios_p); int tcsendbreak(int fd, int duration); int tcdrain(int fd); int tcflush(int fd, int queue_selector); int tcflow(int fd, int action); void cfmakeraw(struct termios *termios_p); speed_t cfgetispeed(const struct termios *termios_p); speed_t cfgetospeed(const struct termios *termios_p); int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed); int cfsetspeed(struct termios *termios_p, speed_t speed);


glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

cfsetspeed(), cfmakeraw(): _BSD_SOURCE

説明

termios 関数群は、非同期通信ポートを制御するための汎用 ターミナルインタフェースである。

termios 構造体

ここに示されている関数の多くは、引き数に termios_p を用いる。 この引き数は termios 構造体へのポインタである。 この構造体には少なくとも以下に示すメンバが含まれる:


tcflag_t c_iflag;      /* input modes */
tcflag_t c_oflag;      /* output modes */
tcflag_t c_cflag;      /* control modes */
tcflag_t c_lflag;      /* local modes */
cc_t     c_cc[NCCS];   /* control chars */

以下に、これらのフィールドに割り当て可能な値について説明する。 最初の 4 つのビットマスクフィールドでは、 関係するフラグの定義のいくつかは、特定の機能検査マクロ (feature_test_macros(7) 参照) が定義された場合にのみ公開される。 必要な機能検査マクロは角括弧 ("[]") 内に書かれている。

以下の説明で、 "POSIX にはない" は その値が POSIX.1-2001 で規定されていないことを意味し、 "XSI" はその値が POSIX.1-2001 の XSI 拡張で 規定されていることを意味する。

c_iflag フラグには以下の要素を指定できる:

入力中の BREAK 信号を無視する。
IGNBRK が設定されている場合は、BREAK 信号は無視される。 IGNBRK が設定されていないが、BRKINT が設定されている場合は、 BREAK 信号によって入出力キューがフラッシュされ、 さらに、端末がフォアグラウンドプロセスグループの制御端末の場合は、 フォアグラウンドプロセスグループに SIGINT が送られる。 IGNBRKBRKINT も設定されていない場合、 BREAK を NULL バイト ('\0') として読み込む。 ただし、PARMRK が設定されている場合は \377 \0 \0 のシーケンスとして 読み込む。
フレームエラーおよびパリティエラーを無視する。
IGNPAR が設定されていない場合、パリティエラーあるいはフレームエラー の発生した文字の前に \377 \0 を付加する。IGNPARPARMRK も 設定されていない場合、パリティエラーあるいはフレームエラーの発生した文字を \0 として読み込む。
入力のパリティチェックを有効にする。
8 ビット目を落とす。
入力の NL (New Line: 改行文字) を CR (Carriage Return: 復帰文字) に 置き換える。
入力の CR を無視する。
(IGNCR が設定されていない場合) 入力の CR を NL に置き換える。
(POSIX にはない) 入力の大文字を小文字に置き換える。
出力の XON/XOFF フロー制御を有効にする。
(XSI) 任意の文字を入力すると、停止していた出力を再開する (デフォルトでは、START 文字でのみ出力が再開される)。
入力の XON/XOFF フロー制御を有効にする。
(POSIX にはない) 入力キューが一杯の時にベルを鳴らす。 Linux ではこのビットは実装されておらず、 常にセットされているかのように振舞う。
(POSIX にはない) 入力が UTF8 である; これにより cooked mode で文字削除 (character-erase) を 正しく機能させることができる。

POSIX.1 で定義されている c_oflag フラグを以下に示す:

実装に依存した出力処理を有効にする。

残りの c_oflag フラグは、特記のない限り POSIX.1-2001 で定義されている。

(POSIX にはない) 出力時に小文字を大文字に変換する。
(XSI) 出力の NL を CR-NL に置き換える。
出力の CR を NL に置き換える。
0 桁目で CR を出力しない。
CR を出力しない。
転送時間を遅らせるのではなく、補填文字 (fill character) を送る。 (訳注:特定の文字に対して、端末側の処理を待つために転送を一定時間 遅らせることができる。また、 OFILL を指定すると 転送を遅らせる代わりに補填文字を送る。)
(POSIX にはない) 補填文字を ASCII DEL にする。 このフラグが設定されていない場合は ASCII NUL ('\0') になる。 (Linux では実装されていない)
NL の遅延を設定する。値は NL0 (遅延なし) および NL1 である。 [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要]
CR の遅延を設定する。値は CR0 (遅延なし), CR1, CR2,CR3 である。 [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要]
水平タブ (horizontal tab) の遅延を設定する。 値は TAB0 (遅延なし), TAB1, TAB2, TAB3 (XTABS) である。 [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要] XTAB3 (これは XTABS と同じである) の値はタブをスペース何個に変換するかを示す (タブは 8 桁毎に止まる)。
後退 (backspace) の遅延を設定する。 値は BS0 (遅延なし) あるいは BS1 である。 (実装されたことはない) [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要]
垂直タブ (vertical tab) の遅延を設定する。 値は VT0 (遅延なし) あるいは VT1 である。
頁送り (form feed) の遅延を設定する。 値は FF0 (遅延なし) あるいは FF1 である。 [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要]

c_cflag フラグは以下の通り:

(POSIX にはない) ボーレートマスク (4+1 ビット)。 [_BSD_SOURCE_SVID_SOURCE が必要]
(POSIX にはない) 追加のボーレートマスク (1 ビット)。 CBAUD に含まれている。 [_BSD_SOURCE_SVID_SOURCE が必要]

(POSIX では、 termios 構造体に格納されたボーレートは正確なものではなく、 ボーレートを操作するために cfgetispeed() と cfsetispeed() が提供されている。 c_cflag 内の CBAUD で選択されたビットを使うシステムもあれば、 sg_ispeedsg_ospeed といった独立したフィールドを使うものもある。)

文字サイズを設定する。 値は CS5, CS6, CS7, CS8 である。
ストップビットを 1 ではなく 2 にする。
受信を有効にする。
出力にパリティを付加し、入力のパリティチェックを行う。
設定されると、入力および出力に対するパリティが奇数パリティとなる。 設定されない場合、偶数パリティが使用される。
最後のプロセスがデバイスをクローズした後、モデムの制御線を low にする (切断する)。
モデムの制御線を無視する。
(POSIX にはない) 現在のシェル層以外からの出力を抑制する。
shl (シェル層) で用いられる。(Linux では実装されていない)
(POSIX にはない) 入力速度のマスク。 CIBAUD ビットのための値は CBAUD ビットのための値と同じであり、 左に IBSHIFT ビットシフトしたものである。 [_BSD_SOURCE_SVID_SOURCE が必要] (Linux では実装されていない)
(POSIX にはない) (一部のシリアルデバイスでサポートされている) 「スティック (stick)」パリティ (マーク/スペース パリティ)を使用する。 PARODD が設定された場合パリティビットは常に 1 となり、 設定されない場合は常に 0 となる。 [_BSD_SOURCE_SVID_SOURCE が必要]
(POSIX にはない) RTS/CTS (ハードウェア) フロー制御を有効にする。 [_BSD_SOURCE_SVID_SOURCE が必要]

c_lflag フラグは以下の通り:

INTR, QUIT, SUSP, DSUSP の文字を受信した時、対応するシグナルを 発生させる。
カノニカルモードを有効にする (下記参照)。
(POSIX にはない; Linux では対応していない) ICANON が同時に設定された場合、端末は大文字のみが有効である。 入力された文字は \ が付いた文字を除いて小文字に変換される。 出力時は、大文字の前に \ が付き、小文字は大文字に変換される。 [_BSD_SOURCE_SVID_SOURCE_XOPEN_SOURCE が必要]
入力された文字をエコーする。
ICANON も同時に設定された場合、ERASE 文字は前の文字を削除し、 WERASE 文字は前の単語を削除する。
ICANON も同時に設定された場合、KILL 文字は現在の行を削除する。
ICANON も同時に設定された場合、 ECHO が設定されていなくても NL 文字をエコーする。
(POSIX にはない) ECHO も同時に設定された場合、 TAB, NL, START, STOP の ASCII 制御文字が ^X としてエコーされる。 X は制御文字より ASCII コードで 0x10 だけ大きな文字である。 例えば文字 0x28 (BS) は ^H とエコーされる。 [_BSD_SOURCE_SVID_SOURCE が必要]
(POSIX にはない) ICANON および IECHO が同時に設定されている場合、 削除された文字も表示される。 [_BSD_SOURCE_SVID_SOURCE が必要]
(POSIX にはない) ICANON も設定された場合、 KILL が行の各文字を消去する代わりにエコーされる。 これは ECHOE および ECHOPRT を指定することと等しい。 [_BSD_SOURCE_SVID_SOURCE が必要]
(POSIX にはない) プロセスが読み込んだときにだけエコーする。 (Linux では実装されていない)
(POSIX にはない; Linux では対応していない) 出力をフラッシュする。このフラグは DISCARD 文字を入力することで切替えられる。 [_BSD_SOURCE_SVID_SOURCE が必要]
SIGINT, SIGQUIT, SIGSUSP シグナル発生時の入力・出力キューのフラッシュを無効にする。
バックグラウンドプロセスのプロセスグループで制御端末へ 文字を出力しようとしているプロセスに対して SIGTTOU シグナルを送る。
(POSIX にはない; Linux では対応していない) 次の文字を読み込んだ時、入力キュー中の全文字を再表示する。 (bash(1) は入力行をこのように処理している。) [_BSD_SOURCE_SVID_SOURCE が必要]
実装依存の入力処理を有効にする。 このフラグは、特殊文字である EOL2, LNEXT, REPRINT, WERASE や、 IUCLC フラグを有効にするために必要である。

c_cc 配列は特殊な制御文字を定義している。 シンボルの一覧 (初期値) と意味は以下の通り。

(003, ETX, Ctrl-C か 0177, DEL, rubout) 割り込み文字。 SIGINT シグナルを送る。 ISIG がセットされている場合に認識し、入力には渡されない。
(034, FS, Ctrl-\) 終了文字。 SIGQUIT シグナルを送る。 ISIG がセットされている場合に認識し、入力には渡されない。
(0177, DEL, rubout か 010, BS, Ctrl-H か #) 消去文字。これにより、直前の未消去文字を消去する。 しかし、EOF や行頭を超えては消去しない。 ICANON がセットされている場合に認識し、入力には渡されない。
(025, NAK, Ctrl-U か Ctrl-X か @) 完全消去文字。直前の EOF か行頭以降の全ての入力を消去する。 ICANON がセットされている場合に認識し、入力には渡されない。
(004, EOT, Ctrl-D) ファイル終端文字。 より正確には、tty バッファの内容を行末を待たずにユーザープログラムに送る。 これが行の最初の文字だった場合、ユーザープログラムの read(2) は 0 を 返し、ファイル終端であることを知らせる。 ICANON がセットされている場合に認識し、入力には渡されない。
非カノニカル読み込み時の最小文字数。
(0, NUL) 追加の行末文字。 ICANON がセットされている場合に認識する。
非カノニカル読み込み時のタイムアウト時間 (1/10 秒単位)。
(POSIX にはない; 0, NUL) 追加の行末文字。 ICANON がセットされている場合に認識する。
(POSIX にはない; Linux では対応していない; 0, NUL) スイッチ文字 (shl でのみ用いられる)。
(021, DC1, Ctrl-Q) 開始文字。停止文字で停止した出力を再開する。 IXON がセットされている場合に認識し、入力には渡されない。
(023, DC3, Ctrl-S) 停止文字。開始文字が入力されるまで出力を停止する。 IXON が設定されている場合に認識し、入力には渡されない。
(032, SUB, Ctrl-Z) 中断文字。 SIGTSTP シグナルを送る。 ISIG がセットされている場合に認識し、入力には渡されない。
(POSIX にはない; Linux では対応していない; 031, EM, Ctrl-Y) 遅延中断文字。ユーザープログラムから文字が読み込まれた時に SIGTSTP シグナルを送る。 IEXTENISIG がセットされていて、システムがジョブ制御に対応している場合に 認識し、入力には渡されない。
(POSIX にはない; 026, SYN Ctrl-V) リテラル。次の入力文字をエスケープし、特別な意味があっても解釈しない。 IEXTEN がセットされている場合に認識し、入力には渡されない。
(POSIX にはない; 027, ETB, Ctrl-W) 単語消去。 ICANONIEXTEN がセットされている場合に認識し、入力には渡されない。
(POSIX にはない; 022, DC2, Ctrl-R) まだ読み込んでいない文字列を再表示する。 ICANONIEXTEN がセットされている場合に認識し、入力には渡されない。
(POSIX にはない; Linux では対応していない; 017, SI, Ctrl-O) 未送信バッファの内容の破棄/保存を切り替える。 IEXTEN がセットされている場合に認識し、入力には渡されない。
(POSIX にはない; Linux では対応していない; 状態要求: 024, DC4, Ctrl-T)

これらのシンボルの示す値は全て異なる。 ただし、 VTIME, VMIN はそれぞれ VEOL, VEOF と同じ値である。 非カノニカルモードでは、特殊文字の意味はタイムアウトの意味に変わる。 VMINVTIME の説明については、下記の非カノニカルモードの説明を参照のこと。

端末の設定の取得と変更

tcgetattr() は fd に関するパラメータを取得し、termios_p が参照する構 造体 termios に設定する。この関数はバックグラウンドプロセスから 呼ばれることもあるが、この場合、端末の属性はフォアグラウンドプロセス によって変化することもある。

tcsetattr() は端末に関連したパラメータを設定する (ハードウェアの設定に必要で、ここで 設定できないものを除く)。設定には termios_p が参照する termios 構造体を用いる。 optional_actions には変更が有効となるタイミングを設定する:

ただちに変更が有効となる。
fd への出力がすべて転送された後に変更が有効になる。この機能は 出力に影響するパラメータを変更する時に使用するべきである。
パラメータを変更する前に、 fd への出力がすべて転送され、受信したがまだ読み込んでいないすべての 入力が破棄される。

カノニカルモードと非カノニカルモード

c_lflagICANON フラグの設定により、端末がカノニカルモードで動作するかが決定される。 ICANON がセットされた場合、カノニカルモード (canonical mode) となり、 セットされない場合、非カノニカルモード (non-canonical mode) となる。 デフォルトでは、 ICANON はセットされる。

カノニカルモードでは、以下のような動作となる。

  • 入力は行単位に行われる。 行区切り文字が打ち込まれた時点で、入力行が利用可能となる。 行区切り文字は NL, EOL, EOL2 および行頭での EOF である。 EOF 以外の場合、 read(2) が返すバッファに行区切り文字も含められる。
  • 行編集が有効となる (ERASE, KILL が効果を持つ。 IEXTEN フラグが設定された場合は、 WERASE, REPRINT, LNEXT も効果を持つ)。 read(2) は最大でも 1行の入力しか返さない。 read(2) が要求したバイト数が現在の入力行のバイト数よりも少ない場合、 要求したのと同じバイト数だけが読み込まれ、 残りの文字は次回の read(2) で読み込まれる。

非カノニカルモードでは、入力は即座に利用可能となり (ユーザは行区切り文字を打ち込む必要はない)、 行編集は無効となる。 MIN (c_cc[VMIN]) と TIME (c_cc[VTIME]) の設定により、 read(2) が完了する条件が決定される。4種類の場合がある:

  • MIN == 0; TIME == 0: データが利用可能であれば、 read(2) はすぐに返る。このときの返り値は、そのとき利用可能なバイト数か read(2) の要求バイト数のうち小さい方となる。 利用可能なデータがない場合 read(2) は 0 を返す。
  • MIN > 0; TIME == 0: read(2) は、利用可能なデータが MIN バイトか要求バイト数のいずれかに達するまで 停止する。返り値は、MIN か要求バイト数の小さい方となる。
  • MIN == 0; TIME > 0: TIME はタイマの上限を規定し、単位は 1/10 秒である。 タイマは read(2) が呼ばれた時点で開始される。 read(2) が返るのは、少なくとも 1バイトのデータが利用可能となった時点、 またはタイマが時間切れとなった時点である。 入力が全くなくタイマが時間切れとなった場合、 read(2) は 0 を返す。
  • MIN > 0; TIME > 0: TIME はタイマの上限を規定し、単位は 1/10 秒である。 入力の最初のバイトが利用可能になった後は、 新たに 1バイト受信する度にタイマがリセットされる。 read(2) が返るのは、MIN バイトか要求バイト数のうち少ない方まで読み出された時点か、 バイト間タイマが時間切れとなった時点である。 は最初のバイトが利用可能にならないとタイマは開始されないので、 少なくとも 1バイトは読み込まれる。

Raw mode

cfmakeraw() は、端末を昔の Version 7 端末ドライバの "raw" モードのように設定する。 入力は文字単位に可能であり、エコーが無効となり、 端末の入出力文字に対する特殊処理はすべて無効となる。 端末の属性は以下のように設定される:


termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;

ライン制御

tcsendbreak() は端末が非同期のシリアルデータ転送を用いている場合に、 連続した0のビット列を一定間隔で転送する。 duration が 0 の場合は、0 のビットを 0.25 秒以上、 0.5 秒以下の間隔で転送する。 duration が 0 でない場合は、 0 のビットを実装依存の時間間隔で送る。

端末が非同期のシリアルデータ転送モードでない場合、 tcsendbreak() は何も行わずに戻る。

tcdrain() は fd が行っている出力の転送が完了するまで待つ。

tcflush() は fd が行っているデータの出力でまだ転送されていないもの、あるいは受信し たがまだ入力していないものを破棄する。いずれを行うかは queue_selector の値で定める:

受信したが読んでいないデータをフラッシュする。
書いたが送信していないデータをフラッシュする。
受信したが読んでいないデータ・書いたが送信していないデータ両方 をフラッシュする。

tcflow() は fd で指定されたオブジェクトにおけるデータの送信あるいは受信を一時的に中断する。 送信と受信のどちらかは、 actionで決まる:

出力の中断。
中断した出力の再開。
STOP 文字の送信。 STOP 文字は端末デバイスからシステムへのデータ送信を停止する。
START 文字の送信。 START 文字は端末デバイスからシステムへのデータ送信を開始する。

端末ファイルがオープンされたときのデフォルトでは、 入力も出力も中断されていない。

ライン速度

ボーレート関数は termios 構造体中の入出力ボーレートを 取得、設定するために提供される。 設定された値は tcsetattr() の呼び出しが成功するまでは有効ではない。

速度を B0 に設定した場合、モデムは停止 (hang up) する。 B38400 に該当する実際のビットレートは setserial(8) で 変更できる。

入力および出力ボーレートは termios 構造体に格納される。

cfgetospeed() は termios_p が示している termios 構造体に格納されている 出力ボーレートを返す。

cfsetospeed() は termios_p で示されている termios 構造体中の出力ボーレートを speed に設定する。値は以下のいずれかでなければならない:

	B0
	B50
	B75
	B110
	B134
	B150
	B200
	B300
	B600
	B1200
	B1800
	B2400
	B4800
	B9600
	B19200
	B38400
	B57600
	B115200
	B230400
0ボー (B0) は接続の中断に用いられる。 B0が指定された場合、モデムの制御線は使用されない状態になり、一般にはこれで 接続が切断される。 CBAUDEX はPOSIX.1で定義されている速度の範囲外 (57600 およびそれ以上) を設定する。すなわち例えば B57600 & CBAUDEX は 0 でない。

cfgetispeed() は termios 構造体中の入力ボーレートを返す。

cfsetispeed() は termios 構造体中の入力ボーレートを speed に設定する。 speed には、上述の cfsetospeed() のボーレート定数 Bnnn のいずれか一つを指定しなければならない。 入力ボーレートが 0 に設定された場合、入力ボーレートは出力ボーレート と同じ値となる。

cfsetspeed() は 4.4BSD による拡張である。この関数は cfsetispeed() と同じ引き数をとり、入出力両方の速度を設定する。

返り値

cfgetispeed() は termios 構造体中の入力ボーレートを返す。

cfgetospeed() は termios 構造体中の出力ボーレートを返す。

他のすべての関数の戻り値:

0
実行成功。
-1
実行失敗。 errno がエラーの種類を示す。

tcsetattr() は なんらかの 変更要求が成功した場合に成功を返すことに注意。 従って、複数の変更を行った場合には、引き続いて tcgetattr() を呼び出して全ての変更が実行されているかを確認する必要があるかもしれない。

準拠

tcgetattr(), tcsetattr(), tcsendbreak(), tcdrain(), tcflush(), tcflow(), cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed() は POSIX.1-2001 で規定されている。

cfmakeraw() と cfsetspeed() は非標準だが、BSD では利用可能である。

注意

Unix V7 とその後のいくつかのシステムでは、ボーレートの 14 個のリストである B0, ..., B9600 の後ろに EXTA, EXTB ("External A" と "External B") の 2 つを 追加している。 多くのシステムではさらに高速なボーレートのためにリストを拡張している。

tcsendbreak() で duration に 0 以外を指定した場合の効果は様々である。 SunOS は duration*N 秒のブレークを規定している。ここで N は 0.25 以上 0.5 未満である。 Linux, AIX, DU, Tru64 は duration ミリ秒のブレークを送信する。 FreeBSD, NetBSD, HP-UX, MacOS は duration の値を無視する。 Solaris と Unixware では、非ゼロの duration を指定した tcsendbreak() の振る舞いは tcdrain() と同様である。

関連項目

stty(1), console_ioctl(4), tty_ioctl(4), setserial(8)

2007-11-26 Linux