termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush,
tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed,
tcgetpgrp, tcsetpgrp ---
端末の属性取得と設定、回線制御、ボーレート
の取得と設定、端末のフォアグラウンド・プロセスのグループIDの取得と設定。
#include <termios.h> #include <unistd.h> int tcgetattr ( int fd, struct termios *termios_p ); int tcsetattr ( int fd, int optional_actions, 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 ); int cfmakeraw ( struct termios *termios_p ); speed_t cfgetospeed ( struct termios *termios_p ); int cfsetospeed ( struct termios *termios_p, speed_t speed); speed_t cfgetispeed ( struct termios *termios_p ); int cfsetispeed ( struct termios *termios_p, speed_t speed); pid_t tcgetpgrp ( int fd ); int tcsetpgrp ( int fd, pid_t pgrpid );
ここでは、非同期通信ポート制御をつかさどっている、一般的な端末 インターフェースであるtermios関数群について記述している。
ここで記述されている多くの関数群は、termios構造体へのポインタで あるtermios_pを引数に取る。この構造体には以下のメンバがある。
tcflag_t c_iflag; /* 入力モード */ tcflag_t c_oflag; /* 出力モード */ tcflag_t c_cflag; /* 制御モード */ tcflag_t c_lflag; /* ローカルモード */ cc_t c_cc[NCCS]; /* 制御文字 */
IGNBRK | 入力時のブレーク状態を無視する |
BRKINT | IGNBRKが設定されていない場合、ブレーク状態にな ったらSIGINTを生成する。そうでなければ、ブレークは \0 として読み込む。 |
IGNPAR | フレーミング・エラーとパリティ・エラーを無視する。 |
PARMRK | IGNPARが設定されていない場合、フレーミング・エ ラーまたはパリティ・エラーになった文字の前に \377 \0 を付加する。 IGNPARもPARMRKも設定されていない場合は、フレーミング・エラーまたはパリ ティ・エラーになった文字は \0 として読み込む。 |
INPCK | 入力パリティ・チェックを有効にする。 |
ISTRIP | 8ビット目を落とす。 |
INLCR | 入力時にNL(ニューライン)をCR(キャリッジ・リ ターン)に変換する。 |
IGNCR | 入力時にキャリッジ・リターンを無視する。 |
ICRNL | (IGNCRが設定されていなければ)入力時にキャリッ ジ・リターンをニューラインに変換する。 |
IUCLC | 入力時に小文字を大文字にマップする。 |
IXON | 出力時にXON/XOFFフロー制御を有効にする。 |
IXANY | 出力を再開させるために、すべての文字を有効にする。 |
IXOFF | 入力時にXON/XOFFフロー制御を有効にする。 |
IMAXBEL | 入力キューがいっぱいになったらベルを鳴らす。 |
OPOST | 実装依存の出力処理を有効にする。 |
OLCUC | 出力時に小文字を大文字にマップする。 |
ONLCR | 出力時に NL を CR-NL にマップする。 |
OCRNL | 出力時に CR を NL にマップする。 |
ONOCR | 0 桁目にはCRを出力しない。 |
ONLRET | CRを出力しない。 |
OFILL | 時間により遅延させるのではなく、遅延の意味の補 完文字を送る。 |
OFDEL | 補完文字を ASCII の DEL にする。設定されていな い場合、補完文字は ASCII の NUL となる。 |
NLDLY | ニューラインの遅延マスク。値は NL0 と NL1 である。 |
CRDLY | キャリッジ・リターンの遅延マスク。値は CR0, CR1, CR2, または CR3 である。 |
TABDLY | 水平タブの遅延マスク。値は TAB0, TAB1, TAB2, TAB3, または XTABS である。XTABS 値は(8桁ごとのタブ・ストップで)タ ブから空白に変換される。 |
BSDLY | バックスぺースの遅延マスク。値は BS0 または BS1 である。 |
VTDLY | 垂直タブの遅延マスク。値は VT0 または VT1 である。 |
FFDLY | フォーム・フィード(改ページ)の遅延マスク。値は FF0 または FF1 である。 |
CSIZE | 文字サイズのマスク。値は CS5, CS6, CS7, または CS8 である。 |
CSTOPB | 設定されていればストップビットは2、そうでなけ れば1になる。 |
CREAD | 受信文字を有効にする。 |
PARENB | 出力時のパリティ生成と、入力時のパリティ・チェ ックを有効にする。 |
PARODD | 入力時と出力時のパリティをodd(奇数)にする。 |
HUPCL | 最後のプロセスがデバイスをクローズ(ハングアッ プ)した場合、モデムの制御線をローレベルにする。 |
CLOCAL | モデムの制御線を無効にする(ローカル接続)。 |
CIBAUD | 入力時のスピードのマスク値(未使用)。 |
CRTSCTS | フロー制御。 |
ISIG | INTR, QUIT, SUSP, DSUSP のいずれかの文字を受信 すると、対応するシグナルを生成する。 |
ICANON | カノニカル(正規)モードにする。これにより EOF, EOL, EOL2, ERASE, KILL, REPRINT, STATUS, WERASE の各文字が有効となり、 行単位でバッファリングされるようになる。 |
XCASE | ICANON も設定されている場合、端末は大文字のみの モードとなる。入力文字は、\. が前に付かない限り小文字に変換される。出 力時は、大文字は前に \ が付き、小文字は大文字に変換される。 |
ECHO | 入力文字をエコーする。 |
ECHOE | ICANON も設定されている場合、ERASE 文字は前に入 力された文字を消し、WERASE は前に入力された単語を消す。 |
ECHOK | ICANON も設定されている場合、KILL は現在行を消す。 |
ECHONL | ICANON も設定されている場合、ECHO が設定されてい なくても NL 文字をエコーする。 |
ECHOCTL | ECHO も設定されている場合、TAB, NL, START および STOP 以外のASCII 制御シグナルは ^X としてエコーされる。X は制御シグナル よりも大きい ASCII コードの 0x10 である。たとえば、文字 0x28 (BS) は ^H としてエコーする。 |
ECHOPRT | ICANON と ECHO も設定されている場合、文字は消さ れようとしているそのままの姿で表示される。 |
ECHOKE | ICANON も設定されている場合、KILL は、ECHOE や ECHOPRT で指定されているように、現在行の各文字を消しているようにエコー される。 |
FLUSHO | 出力はフラッシュされる。このフラグは DISCARD 文 字をタイプするたびにトグルされる。 |
NOFLSH | SIGINT や SIGQUIT シグナルが生成された時は入力 キューと出力キューをフラッシュせず、 SIGSUSP シグナルを生成した時にフ ラッシュするようにする。 |
TOSTOP | 自分が制御しているターミナルに書き込もうとして いるバックグラウンド・プロセスのプロセス・グループに SIGTTOU シグナルを送る。 |
PENDIN | 入力キューの中のすべての文字は、次の文字が読み 込まれた時に再度表示される。(bash はこの方法で先打ちを実現している) |
IEXTEN | 実装依存の入力処理を有効にする。 |
tcgetattr() は、fd により参照されるオブジェクトに関連付けられた パラメータを取得して、それらを termios_p により参照される termios 構造 体の中に格納する。この関数はバックグラウンド・プロセスから呼び出される こともあるかもしれないが、その場合それに続いて実行されたフォアグラウン ド・プロセスにより、端末属性が変更されてしまっている可能性もありうる。
tcsetattr() は、termios_p により参照される termios 構造体からの 情報により、(基礎となるハードウェアがそれをサポートできないものでない 限り、)端末に関連付けられたパラメータを設定する。optional_actions は、 変更をいつ反映させるかを、以下のように指定する。
TCSANOW | 変更を即時に反映させる。 |
TCSADRAIN | fd に書き込まれたすべての出力を転送し終わった後 に、変更を反映させる。変更するパラメータが出力に影響する場合は、この機 能を使うべきである。 |
TCSAFLUSH | fd により参照されるオブジェクトへ書き込まれたす べての出力を転送し終わり、かつすべての入力が受信された後に、変更を反映 させるが、変更が行われる前に読み込まれていないものは捨てられる。 |
tcsendbreak() は、端末が非同期のシリアルデータ転送を行っている 場合、連続した0値のビット列を、指定した持続時間の間連続して送出する。 指定した持続時間が0の場合、0値のビット列は 0.25 秒〜 0.5 秒間送出さ れる。持続時間が0でない場合、0値のビット列は持続時間×N 秒間送出され る。N の値は 0.25 〜 0.5 である。
端末が非同期のシリアルデータ転送を行っていない場合、tcsendbreak() は何もせずに戻る。
tcdrain() は、fd により参照されるオブジェクトへ書き込まれたすべ ての出力を転送し終わるまで待つ。
tcflush() は、queue_selector の値にしたがって、fd により参照さ れるオブジェクトへ書き込まれているがまだ送出されていないデータや、受 信が完了しているがまだ読み込まれていないデータを破棄する。
TCIFLUSH | 受信が完了しているがまだ読み込まれていないデー タを破棄する。 |
TCOFLUSH | 書き込まれているがまだ送出されていないデータを 破棄する。 |
TCIOFLUSH | 書き込まれているがまだ送出されていないデータ、 および受信が完了しているがまだ読み込まれていないデータの双方を破棄する。 |
tcflow() は、action の値にしたがって、fd により参照されるオブジ ェクト上のデータの送受信を一時停止する。
TCOOFF | 出力を一時停止する。 |
TCOON | 出力を再開する。 |
TCIOFF | 端末デバイスがデータをシステムに送信するのを停 止させるための STOP 文字を送出する。 |
TCION | 端末デバイスがデータをシステムに送信するのを開 始させるための START 文字を送出する。 |
端末ファイルをオープンする際のデフォルトは、入出力ともに一時停 止していない状態である。
ボーレート関数は、termios 構造体にある入出力時のボーレートを取 得/設定するためにある。新しい値は、tcsetattr() のコールが成功するま では反映されない。
速度を B0 にするということは、モデムをハングアップさせるこ とである。 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
ボーレート値 B0 は、接続を終了させるために使われる。B0 が指定さ れると、モデムの制御線はもはやアサートされなくなる。通常は、これで回線 を切断する。CBAUDEX は POSIX.1 で定義された値を越える速度(57600 以上) を定義するためのマスクである。そのため、B57600 & CBAUDEX の値は0ではない。
cfgetispeed() は、termios 構造体に格納されている、入力ボーレー トを返す。
cfsetispeed() は、termios 構造体に格納されている入力ボーレート を speed に設定する。入力ボーレートが0に設定されると、入力ボーレート は出力ボーレートに等しくなる。
tcgetpgrp() は、フォアグラウンドのプロセスのプロセス・グループ IDを返し、エラーの場合 -1 を返す。
tcsetpgrp() は、プロセス・グループIDを pgrpid に設定する。 pgrpid は、同一のセッションにあるプロセス・グループのIDでなければなら ない。
cfgetispeed() は、termios 構造体に格納された入力ボーレートを返す。
cfgetospeed() は、termios 構造体に格納された出力ボーレートを返す。
tcgetpgrp() は、フォアグラウンド・プロセス・グループのグループ IDを返し、エラーなら -1 を返す。
その他のすべての関数は、以下の値を返す。
0 | 成功した時。 |
-1 | 失敗した時。エラー内容は errno にセットされる。 |
setserial(8)
この文書は、Linux Slackware 3.4 の man 3 termios (1995/09/02版) を堀田倫英(sim@remus.dti.ne.jp) が翻訳したものです。