TERMIO(4V) — NEWS-OS Programmer’s Manual
名称
termio − 端末インターフェース
形式
#include <termios.h>
#include <termio.h>
解説
全ての非同期通信ポートや疑似端末は、同じインターフェースを使用し、 ハードウエアに依存しません。 このインターフェースについては、 tty(4) で詳しく述べられています。 ここでは、 termios 構造体を用いる POSIX インターフェースと termio 構造体を用いる System V インターフェースにについて説明します。
端末ファイルをユーザプログラムがオープンすることは ほとんどありません。 これらのファイルは、通常 getty(8) によってオープンされ、 ユーザの標準入力、標準出力、標準エラー出力となります。
端末は通常、全二重モードで動作します。 文字はいつでも入力可能であり、 出力中であっても構いません。 入力文字が失われるのは、システムの文字入力バッファが 完全に使い尽くされてしまった時(これは、滅多にありません)、 あるいはプログラムがまだ読み込んでいない入力文字の数が 許容される最大入力文字数となった時です。 その最大文字数は、現在 256 文字です。
通常、 端末入力は行単位で処理されます。 1 行は、改行文字 (ASCII LF)、 または EOF 文字 (デフォルトは control-D)、 または EOL 文字で区切られます。 つまり、 読み込みをしようとするプログラムは その行が完全にタイプされるまで処理が中断されます。 また、 read システムコールでどんなに多くの文字を要求しても 最大限 1 行が返されます。 しかし、一度に行全体を読む必要はありません。 1 回の read で何文字でも (たとえ 1 文字でも) 要求でき、 文字を失うようなことはありません。
入力中、1 文字削除 (erase)、 および 1 行削除 (kill) 処理が行われます。 erase 文字のデフォルトは ASCII DEL で、最後にタイプされた文字を削除します。 ただし、これは行の先頭では行われません。 kill 文字のデフォルトは control-U で、入力行全体を削除します。 erase 文字および kill 文字を文字として入力するには、 エスケープ文字 \ を前に付けます。 この場合、 エスケープ文字は読まれません。 erase 文字および kill 文字は変更できます。
いくつかの文字は、入力時に特殊な機能を持ちます。 これらの機能と文字のデフォルトの値を以下に要約します。
INTR (control-C) は、 SIGINT シグナルを発生させ、 それは制御端末 (tty(4) 参照)に関連する全てのプロセスに送られます。 通常、各プロセスは強制的に終了させられますが、 そのシグナルを無視したり、 指定した位置にトラップするようにもできます。 sigvec(2) 参照。
QUIT (control-\) は、 SIGQUIT シグナルを発生します。 このシグナルを受け取るプロセスが他の設定をしていない限り、 core と呼ばれるコアイメージファイルがカレントディレクトリに 生成される以外は、 SIGINT シグナルと同じ処理が行われます。
ERASE (ASCII DEL) は、1 つ前の文字を削除します。 改行文字、 EOF、 EOL で 区切られた行の先頭では働きません。
KILL (control-U) は、改行文字、 EOF、 EOL で区切られた行全体を削除します。
EOF (control-D) は、端末からの end-of-file を生成します。 この時、読み込まれるのを待っている全ての文字は 改行を待たずにすぐにプログラムに渡されます。 EOF は捨てられます。 したがって、待っている文字がない、 すなわち行の先頭にいる時に EOF がくると、 0 文字が返され、標準的な end-of-file を示します。
NL (ASCII LF) は、通常の行区切り文字です。 変更はできません。
EOL (ASCII NUL) は、 NL と同様のもうひとつの区切り文字です。 通常は使用されません。
STOP (control-S) は、一時的に出力を停止する場合に使用します。 端末で、読まないうちに出力が消えてしまうのを防ぐのに有効です。 出力が停止した時、 STOP 文字は無視されて読み込まれません。
START (control-Q) は、 STOP で停止した出力を再開する場合に使用します。 出力が停止していない時は、 START 文字は無視されて読み込まれません。 START/STOP 文字はエスケープできません。
SUSP (control-Z) は、 SIGTSTP シグナルを発生します。 これは、カレントプロセスグループをサスペンドするのに使用されます。
DSUSP (control-Y) は、 SUSP と同様に SIGTSTP シグナルを発生します。 この文字がタイプされたときではなく、 プログラムが DSUSP を読もうとしたときにシグナルが送られます。
REPRINT (control-R) は、 未処理の入力を新しい行の先頭からタイプしなおします。
DISCARD (control-O) により、 以降の出力は、プログラムによって c_lflag の FLUSHO ビットがクリアされるか、 何か文字が入力されるまでフラッシュされます。 この文字は、保留中の入力文字があればそれを再表示します。
WERASE (control-W) は、一つ前の語を消します。 その前のスペースは消しません。 WERASE のために語が定義されていて、 それはブランクを含まない文字の列です。 タブはブランクとみなされます。
LNEXT (control-V) は、次の 1 文字が文字として以外の機能を持っていても、 その特別な意味を無効にし、 単に文字として扱うものです。
INTR、 QUIT、 ERASE、 KILL、 EOF、 EOL、 START、 STOP、 SUSP、 DSUSP、 REPRINT、 DISCARD、 WERASE、 LNEXT の値は個々に変更できます。
モデムからのキャリア信号が落ちた場合、 この端末を制御端末として持つ全てのプロセスに SIGHUP シグナルが送られます。 他の設定がされていない限り、 このシグナルはプロセスを終了させます。 SIGHUP シグナルを無視する場合でも、次からの read は end-of-file の状態でリターンします。 したがって、端末から読み込みを行い、かつ EOF をチェックしているプログラムは、 回線が切れたときに終了することができます。
1 つ以上の文字を書き込むと、その文字は、 それ以前に書き込まれた文字の出力が終わってから すぐに端末に転送されます。 入力文字は到着すると、 出力キューにおかれエコーされます。 印字スピード以上のスピードでプロセスが文字を生成すると、 出力キューがある限界を超えた時、そのプロセスはサスペンドされます。 そのキューがどんどん減ってある境界値になると、プログラムは再開します。
いくつかの ioctl(2) システムコールが端末ファイルに対して適用できます。 基本的なシステムコールは、 <termios.h> または <termio.h> で定義されている次の構造体を使用します。
#define NCCS17
typedef unsigned long tcflag_t;
typedef unsigned char cc_t;
struct termios {
tcflag_tc_iflag;/∗ input modes ∗/
tcflag_tc_oflag;/∗ output modes ∗/
tcflag_tc_cflag;/∗ control modes ∗/
tcflag_tc_lflag;/∗ line discipline modes ∗/
cc_tc_cc[NCCS];/∗ control characters ∗/
};
#define NCC8
struct termio {
unsigned shortc_iflag;/∗ input modes ∗/
unsigned shortc_oflag;/∗ output modes ∗/
unsigned shortc_cflag;/∗ control modes ∗/
unsigned shortc_lflag;/∗ line discipline modes ∗/
charc_line;/∗ line discipline ∗/
unsigned charc_cc[NCC];/∗ control characters ∗/
};
特殊制御文字は c_cc で定義します。 各機能の相対位置および初期値は以下のとおりです。
0VINTRcontrol-C
1VQUITcontrol-\
2VERASEDEL
3VKILLcontrol-U
4VEOFcontrol-D
5VEOLNUL
6reserved
7reserved
8VSTARTcontrol-Q
9VSTOPcontrol-S
10VSUSPcontrol-Z
11VDSUSPcontrol-Y
12VREPRINTcontrol-R
13VDISCARDcontrol-O
14VWERASEcontrol-W
15VLNEXTcontrol-V
termio 構造体では、 c_cc として最初の 8 個 (VSTART の直前まで)しか使用できません。
c_iflag フィールドは、基本的は端末の入力制御についての記述です。
IGNBRK0000001ブレーク入力を無視。
BRKINT0000002ブレーク入力時に SIGINT シグナル発生。
IGNPAR0000004パリティエラーの文字を無視。
PARMRK0000010パリティエラーの文字に特別な印を付ける。
INPCK0000020入力パリティチェックを行う。
ISTRIP0000040文字の最上位ビットをゼロにする。
INLCR0000100入力時、NL を CR へマップ。
IGNCR0000200入力の CR を無視。
ICRNL0000400入力時、CR を NL へマップ。
IUCLC0001000入力時、大文字を小文字にマップ。
IXON0002000出力の START/STOP 制御を可能にする。
IXANY0004000出力を再開しするための文字を何でも認める。
IXOFF0010000入力の START/STOP 制御を可能にする。
IGNBRK を設定すると、ブレーク状態 (データが全てゼロであるキャラクタフレーミングエラー) が無視されます、つまり入力キューに入れられず、 どのプロセスからも読まれません。 そうでなく、 BRKINT が設定されると、 ブレーク状態が SIGINT を生成し、 入力および出力キューをフラッシュします。 IGNPAR を設定すると、 フレーミングおよびパリティエラーのある文字は無視されます。
PARMRK を設定すると フレーミングおよびパリティエラーで無視された文字が、’\0377’、’\0’、 X という 3 文字のシーケンスとして読まれます。 ただし、 X は受信したエラーデータです。 この場合、 ISTRIP が設定されていないと、曖昧さをさけるために 正しい値 ’\377’ は ’\377’、’\377’ として読まれます。 PARMRK を設定しないと、 フレーミングおよびパリティエラーの文字が無視されず、 NUL (0) として読まれます。
INPCK を設定すると、入力のパリティチェックを行います。 INPCK を設定しないと、入力のパリティチェックを行いません。 また、 入力のパリティエラーなしで出力のパリティを生成します。
ISTRIP を設定すると、 有効な入力文字は最初にストリップされて、7 ビットになります。 設定がなければ、8 ビットて全てが処理されます。
INLCR を設定すると、受信した NL 文字は CR に変換されます。 IGNCR を設定すると、 受信した CR は無視されます (読み込まれません)。 ICRNL を設定すると、 受信した CR は NL に変換されます。
IUCLC を設定すると、 受信した大文字のアルファベットは 対応する小文字のアルファベットに 変換されます。
IXON を設定すると、 出力の START/STOP 制御を行います。 受信した STOP 文字は出力を停止し、 受信した START 文字は出力を再開します。 START/STOP 文字はすべて無視され読み込まれません。 IXANY を設定すると、どんな入力文字が来ても、 停止されていた出力を再開します。
IXOFF を設定すると、 入力キューが空または 満杯の状態に近付いたときに、 システムが START/STOP 文字を送出します。
入力コントロールの初期値は ICRNL です。
c_oflag フィールドは、出力に関するシステムの扱いを指定します。
OPOST0000001出力の後処理を行う。
OLCUC0000002出力時、小文字を大文字にマップ。
ONLCR0000004出力時、NL を CR-NL へマップ。
OCRNL0000010出力時、CR を NL へマップ。
ONOCR0000020カラム 0 での CR 出力無し。
ONLRET0000040NL が CR 機能を持つ。
OFILL0000100ディレイにはフィル文字を使用。
OFDEL0000200フィル文字を DEL にする。通常は NUL。
NLDLY0000400改行ディレイを選択。
NL00
NL10000400
CRDLY0003000キャリッジリターンディレイを選択。
CR00
CR10001000
CR20002000
CR30003000
TABDLY0014000水平のタブディレイを選択。
TAB00
TAB10004000
TAB20010000
TAB30014000タブを空白に拡張。
BSDLY0020000バックスペースディレイを選択。
BS00
BS10020000
VTDLY0040000垂直のタブディレイを選択。
VT00
VT10040000
FFDLY0100000用紙送りディレイを選択。
FF00
FF10100000
OPOST を設定すると、 出力文字は残りのフラグで示すような後処理が行われます。 設定しないと、 文字は変更無しで送出されます。
OLCUC を設定すると、 小文字は対応する大文字として送出されます。 この機能を使用するとしたら、 IUCLC と共に使用されるのが普通です。
ONLCR を設定すると、NL 文字は CR-NL という文字の組合せで送出されます。 OCRNL を設定すると、CR 文字は NL 文字として送出されます。 ONOCR を設定すると、 カラム 0 (行の先頭) で CR 文字が送出されません。 ONLRET を設定すると、NL 文字はキャリッジリターンと同様に働くと仮定されます。 カラムポインタは 0 に設定され、 CR のために指定したディレイが使用されます。 そうでなければ、NL 文字は行送りだけの機能を果すと仮定されます。 カラムポインタはそのままで変更されません。 CR が実際に転送されると、 カラムポインタも 0 に設定されます。
ディレイビットは、ある文字が端末に送られたとき、 メカ的な動作またその他の動作を許すために必要な転送の停止時間を 設定します。 値が 0 であれば、 ディレイなしとなります。 OFILL を設定すると、時間によるディレイの代りにフィル文字が送出されます。 これは、最小のディレイが要求される高速のボーレイトの端末に有効です。 OFDEL を設定するとフィル文字は DEL に、設定しないと NUL になります。
用紙送り、垂直方向のタブディレイを指定すると、 それは 2 秒間となります。
改行では約 0.10 秒となります。 ONLRET を設定すると、 キャリッジリターンディレイが 改行ディレイの代りに使用されます。 OFILL を設定すると、 2 つのフィル文字が送出されます。
キャリッジリターンのタイプ 1 はカレントのカラム位置に左右され、 タイプ 2 は約 0.10 秒、タイプ 3 は約 0.15 秒となります。 OFILL を設定すると、 ディレイタイプ 1 は 2 つのフィル文字を送出し、 タイプ 2 は 4 つのフィル文字を送出します。
水平のタブディレイのタイプ 1 は カレントのカラム位置に左右され、 タイプ 2 は約 0.10 秒、 タイプ 3 はタブを空白に拡張することを指定します。 OFILL を設定すると、 2 つのフィル文字が全てのディレイに対して送出されます。
バックスペースディレイは約 0.05 秒続きます。 OFILL を設定すると、 1 つのフィル文字が送出されます。
実際のディレイは、 回線のスピードおよびシステムの負荷に左右されます。
出力コントロールの初期値は、 OPOST、 ONLCR です。
c_cflag フィールドは、端末のハードウエアコントロールについて指定します。
CBAUD0000017ボーレート:
B00バングアップ
B50000000150 ボー
B75000000275 ボー
B1100000003110 ボー
B1340000004134.5 ボー
B1500000005150 ボー
B2000000006200 ボー
B3000000007300 ボー
B6000000010600 ボー
B120000000111200 ボー
B180000000121800 ボー
B240000000132400 ボー
B480000000144800 ボー
B960000000159600 ボー
B19200000001619200 ボー
B38400000001738400 ボー
EXTA0000016外部 A
EXTB0000017外部 B
CSIZE0000060文字のサイズ:
CS505 ビット
CS600000206 ビット
CS700000407 ビット
CS800000608 ビット
CSTOPB00001002 つのストップビットを送る。通常は 1 つ
CREAD0000200受信動作可能
PARENB0000400パリティ使用
PARODD0001000 奇数パリティ。通常は偶数パリティ
HUPCL0002000最後のクローズで回線を切る
CLOCAL0004000ローカル回線、通常はダイアルアップ
CIBAUD03600000入力ボーレート
CBAUD ビットはボーレートを指定します。 ゼロすなわち B0 は、接続をハングアップさせるために使用されます。 B0 が指定されると、DTR 信号がオフになります。 通常、これは回線の接続を切ります。 特定のハードウエアに関しては、不可能な速度変更は無視されます。
CSIZE ビットは、送信および受信時の文字サイズを指定します。 これはパリティビットを含みません。 CSTOPB を設定すると、2 つのストップビットが使用され、 設定しないと、 ストップビットは 1 つとなります。 例えば、110 ボーでは 2 つのストップビットが必要です。
PARENB を設定すると、 パリティの生成および検知が可能となります。 そして、パリティビットが各文字に付加されます。 パリティが可能の場合、 PARODD フラグは奇数パリティを指定します。 指定しなければ、偶数パリティが使用されます。
CREAD を設定すると、レシーバが動作可能です。 設定しないと、文字を受信できません。
HUPCL を設定すると、 その回線をオープンしている最後のプロセスが それをクローズするかあるいは終了したときに、 その回線の接続が切られます。 つまり、DTR 信号がオフになります。
CLOCAL を設定すると、その回線はローカルで、 モデムコントロールなしのダイレクト接続であると仮定されます。 設定しないと、モデム制御が仮定されます。
オープン後のハードウエアコントロール値の初期値は、 B9600、 CS8、 CREAD、 HUPCL となります。
引数の構造体の c_lflag フィールドは、 端末の機能を制御するラインディシプリン (回線制御) として使用されます。 基本的なラインディシプリンは以下のようになります。
ISIG0000001シグナルを使用可能にする
ICANON0000002入力編集 (erase 処理と kill 処理)
XCASE0000004大文字小文字変換処理
ECHO0000010入力文字をエコーする
ECHOE0000020erase 文字を BS-SP-BS のようにエコー
ECHOK0000040kill 文字の後で NL をエコー
ECHONL0000100NL のエコー
NOFLSH0000200interrupt または quit の後のフラッシュ禁止
TOSTOP0000400バックグラウンドジョブの出力に対して SIGTTOU シグナルを送る
ECHOCTL0001000入力されたコントロール文字を ^X で、DEL を ^? でエコー
ECHOPRT0002000プリンタ端末のエコーモード
ECHOKE0004000削除の時、BS-SP-BS で行全体を削除する
FLUSHO0020000出力が捨てられる
PENDIN0040000次の read か文字入力で保留入力を表示し直す
ISIG を設定すると、 各入力文字は特殊制御文字 INTR、 および QUIT かどうかチェックされます。 入力文字がそれらの文字と一致する場合、 その文字の機能が実行されます。 ISIG を設定しないと、 チェックは行われません。 また、これらの特殊入力の機能は、 ISIG が設定された場合に限り有効です。 制御文字の値を、全く違った値つまり通常使用しない文字 (例えば、0377) に 変更することで個々の機能を禁止することができます。
ICANON を設定すると、 入力編集処理が行われます。 すなわち、 erase および kill 編集機能や、入力文字をまとめて NL、 EOF、 EOL で区切られた行にすることができます。 ICANON を設定しないと、 読み込み要求は、入力キューから直接とられるようになります。
XCASE が設定され、かつ ICANON が設定されていると、 文字の前に \ を付けることで、 大文字を入力できます。 また、大文字は前に \ をつけて出力されます。 このモードでは、 出力時に以下のエスケープシーケンスが生成され、 入力時も可能です。
`|~{}\に対して
\´\!\^\(\)\\を使用します。
例えば、 A は \a で、 \n は \\n で、 \N は \\\n で入力されます。
ECHO を設定すると、文字は受信時にエコーされます。
ICANON を設定すると、 以下のエコー機能が可能です。 ECHO および ECHOE が設定されると、 erase 文字が ASCII BS-SP-BS としてエコーされます。 これは CRT 画面から最後の文字を消去します。 ECHOK を設定すると、NL 文字が kill 文字の後でエコーされ、 行を削除したことを強調します。 erase 文字または kill 文字の前のエスケープ文字は、 特殊機能を取り除くことに注意してください。
NOFLSH を設定すると、 intr、 quite、 susp 文字に関連した 入力および出力キューのフラッシュが行われません。
TOSTOP を設定すると、 プロセスが制御端末に関連するプロセスグループに入っていないとき、 その端末への書き込みが禁止されます。 ただし SIGTTOU シグナルをキャッチするか無視しているプロセス、または vfork(2) の途中であるプロセスは除外され、出力を行うことが許されています。
ECHOCTL を設定すると、 印字できないコントロール文字 control-X (X はある文字) が、 そのままエコーされるのではなく、 ^X のようにエコーされます。 DEL は ^? とエコーされます。
ECHOPRT を設定すると、 論理的に削除された文字列が、 \ と / に挟まれて逆向きに印字されます。 ECHOKE を設定すると、 行削除処理が BS-SP-BS のシーケンスを使用して行全体を削除します。 FLUSHO を設定すると、 プログラムまたは文字を入力することによって、 このビットがクリアさせるまで、後に続く出力は捨てられます。
PENDIN を設定すると、 次の入力文字を受信したとき、保留中の文字を再表示します。
ラインディシプリンのコントロール値の初期値は、 ISIG、 ICANON、 ECHO です。
POSIX の ioctl(2) システムコールは以下の形式です。
ioctl (fildes, command, arg)
struct termios ∗arg;
この形式でのコマンドは、次のとおりです。
TCGETS その端末に関するパラメータを獲得し、 arg で参照する termios 構造体に格納する。
TCSETS arg で参照する 構造体からその端末に関するパラメータ を設定する。 変更はすぐに行われる。
TCSETSW 新規のパラメータを設定する前に 出力が完了するのを待つ。 出力に影響するパラメータを 変更する場合のみ使用すること。
TCSETSF 出力が完了するのを待ち、 入力キューをフラッシュさせ、 新規のパラメータを設定する。
System V の ioctl(2) システムコールは以下の形式です。
ioctl (fildes, command, arg)
struct termio ∗arg;
この形式でのコマンドは、次のとおりです。
TCGETA その端末に関するパラメータを獲得し、 arg で参照する termio 構造体に格納する。
TCSETA arg で参照する 構造体からその端末に関するパラメータ を設定する。 変更はすぐに行われます。
TCSETAW 新規のパラメータを設定する前に 出力が完了するのを待つ。 出力に影響するパラメータを 変更する場合のみ使用すること。
TCSETAF 出力が完了するのを待ち、 入力キューをフラッシュさせ、 新規のパラメータを設定する。
さらに次の形式の ioctl(2) システムコールがあります。
ioctl (fildes, command, arg)
int arg;
この形式を使用するコマンド:
TCSNDBRK
TCSBRK arg が 0 であれば 0.25 秒間、 0 でなければ (arg ∗ 0.25) 秒間ブレーク信号を送出する。 TCSBRK は <termio.h> の中で定義されています。
TCXONC START/STOP コントロール。 arg が TCOOFF (0) であれば、出力を停止する。 TCOON (1) であれば、停止している出力を再開する。 TCIOFF (2) であれば、入力を停止する。 TCION (3) であれば、停止している入力を再開する。
TCFLSH arg が TCIFLUSH (0) であれば、 入力キューをフラッシュさせる。 TCOFLUSH (1) であれば、 出力キューをフラッシュさせる。 TCIOFLUSH (2) であれば、 入力および出力キューをフラッシュさせる。
TCDRAIN 出力が完了するのを待つ。
関連ファイル
/dev/tty∗
関連事項
stty(1V), fork(2), ioctl(2), setpgrp(2), sigvec(2), tty(4), tcsetattr(3V), cfgetospeed(3V), tcsendbreak(3V), tcgetpgrp(3V)
バグ
POSIX や SystemV の機能のうちいくつかは実現されていません。 例えば、 c_iflag の ICANON ビットがクリアされたときの、 c_cc[VMIN]、 c_cc[VTIME] などは動作しません。
NEWS-OSRelease 4.2.1R