kazmax - Linux で自宅サーバー

termios - ライブラリコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. 注意
  6. 関連項目

名前

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 );

説明

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 フラグには以下の要素を指定できる:

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

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

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

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

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

c_cflag フラグは以下の通り:

CBAUD
(POSIX にはない) ボーレートマスク (4+1 ビット)。 [_BSD_SOURCE か _SVID_SOURCE が必要]
CBAUDEX
(POSIX にはない) 追加のボーレートマスク (1 ビット)。 CBAUD に含まれている。 [_BSD_SOURCE か _SVID_SOURCE が必要]
(POSIX では、 termios 構造体に格納されたボーレートは正確なものではなく、 ボーレートを操作するために cfgetispeed ()と cfsetispeed ()が提供されている。 c_cflag 内の CBAUD で選択されたビットを使うシステムもあれば、 sg_ispeedsg_ospeed といった独立したフィールドを使うものもある。)
CSIZE
文字サイズを設定する。 値は CS5 , CS6 , CS7 , CS8 である。
CSTOPB
ストップビットを 1 ではなく 2 にする。
CREAD
受信を有効にする。
PARENB
出力にパリティを付加し、入力のパリティチェックを行う。
PARODD
入力および出力を奇数パリティとする。
HUPCL
最後のプロセスがデバイスをクローズした後、モデムの制御線を low にする (切断する)。
CLOCAL
モデムの制御線を無視する。
LOBLK
(POSIX にはない) 現在のシェル層以外からの出力を抑制する。 shl (シェル層) で用いられる。(Linux では実装されていない)
CIBAUD
(POSIX にはない) 入力速度のマスク。 CIBAUD ビットのための値は CBAUD ビットのための値と同じであり、 左に IBSHIFT ビットシフトしたものである。 [_BSD_SOURCE か _SVID_SOURCE が必要] (Linux では実装されていない)
CRTSCTS
(POSIX にはない) RTS/CTS (ハードウェア) フロー制御を有効にする。 [_BSD_SOURCE か _SVID_SOURCE が必要]

c_lflag フラグは以下の通り:

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

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

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

これらのシンボルの示す値は全て異なる。 ただし、VTIME, VMIN はそれぞれ VEOL, VEOF と同じ値である。 非カノニカルモードでは特殊文字はタイムアウトの意味になる。 MIN (VMIN を使って指定) は read を満足させるために受信するべき最小の文字数を示す。 TIME (VTIME を使って指定) は 1/10 秒単位のタイマーである。 両方がセットされると、read は少なくとも 1 文字を受信するまで待ち、 それから MIN 文字分受信するか、 最後に文字を受信してから TIME だけ時間が経過した時点で戻る。 MIN のみがセットされると、read は MIN 文字分受信するまで戻らない。 TIME のみがセットされると、1 文字受信するか、タイマーがタイムアウトすると戻る。 どちらもセットされていないと、read は既に受信している文字だけを使って 直ちに戻る。

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

tcsetattr ()は端末に関連したパラメータを設定する (ハードウェアの設定に必要で、ここで 設定できないものを除く)。設定には termios_p が参照する termios 構造体を用いる。 optional_actions には変更が有効となるタイミングを設定する:
ただちに変更が有効となる。
fd への出力がすべて転送された後に変更が有効になる。この機能は 出力に影響するパラメータを変更する時に使用するべきである。
パラメータを変更する前に、 fd への出力がすべて転送され、受信したがまだ読み込んでいないすべての 入力が破棄される。

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 構造体に格納される。

cfmakeraw () は端末の属性を以下に示す通りに設定する:


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;

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 構造体中の出力ボーレートを返す。

他のすべての関数の戻り値:
実行成功。
実行失敗。 errno がエラーの種類を示す。

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

注意

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 ()と同様である。

関連項目