| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 7 : デバイス特殊ファイルセクション 9 : 一般情報 > ttermio(7)HP-UX 11i Version 2: September 2004 |
|
名称termio, termios ― 汎用ターミナルインタフェース 説明HP-UX の非同期の通信ポートはすべて、使用されるハードウェアには依存しない 1 つの汎用インタフェースを使用します。例えば rlogin (rlogin(1) を参照) のようなネットワーク接続は、疑似ターミナルインタフェース (pty(7) を参照) を使用します。 ここでは、このような汎用インタフェースに共通の機能について説明します。 ターミナルファイルのオープンターミナルファイルをオープンする場合、実際に連結が確立されるまでそのプロセスは待たされます。ただしユーザープログラムがターミナルファイルをオープンすることは、通常はあまりありません。オープンするのは getty (getty(1M) を参照) のような特殊なプログラムであり、ユーザーには標準入力、標準出力、標準エラーファイルとして渡されるのが普通です。 O_NDELAY フラグと O_NONBLOCK フラグ (open(2) を参照) の両方がクリアされている場合は、 open はモデム接続要求 (modem(7) を参照) が完了するまでブロックされます。また O_NDELAY フラグと O_NONBLOCK フラグのどちらかがセットされている場合は、 open はモデム接続要求が完了するのを待たずに正常終了します。また CLOCAL フラグ (「制御モード」 を参照) の値によって open(2) の動作が変わることもあります。 プロセスグループ各ターミナルはそれぞれに対応するフォアグラウンド プロセスグループを 1 つ持つことができます。このフォアグラウンド プロセスグループは、シグナルを生成する入力文字の操作の際に特別な役割を果たします。 コマンドインタプリタ プロセスは、関連するいくつかのプロセスを 1 つのプロセスグループの中に入れて、そのプロセスグループをターミナルに割り当てるという手順により、あるターミナルに別の jobs (プロセスグループ) を割り当てることができます。またプロセスはターミナルのフォアグラウンド プロセスグループの値を得たり変更したりすることもできます。ただし、そのためにはパーミッションの要求が満たされている必要があります (tcsetpgrp(3C) と tcgetpgrp(3C) を参照)。ターミナルインタフェースは、フォアグラウンド プロセスグループに入っていないプロセスからのターミナルへのアクセスの制限にも使用されます。 あるプロセスグループ中のすべてのプロセスの上位のプロセスが同じプロセスグループに含まれているか、あるいは、そのグループのセッション (「セッション」 を参照) に含まれていない場合は、そのプロセスグループは親なしのプロセスグループと言われます。 セッションセッション (setsid(2) または setpgrp(2) を参照) を生成するプロセスはセッションリーダとなります。すべてのプロセスグループは必ず 1 つのセッションに属します。プロセスは、自分のプロセスグループが属しているセッションのメンバーとなります。新しく生成されたプロセスは、自分の上位のプロセスが属しているセッションのメンバーになります。プロセスが属するセッションを変更することも可能です (setpgid(2) または setpgrp(2) を参照)。通常、1 つのセッションは 1 つのログインから生成されたすべてのプロセス (その子プロセスも含む) から構成されます。 制御ターミナルターミナルはプロセスの制御ターミナルになれます。制御ターミナルを持つセッションでは、すべてのプロセスは同じ制御ターミナルを持ちます。1 つのターミナルは複数のセッションの制御ターミナルにはなれません。セッションの制御ターミナルはセッションリーダによって割り当てられます。セッションリーダが制御ターミナルを持たず、かつ、まだどのセッションにも割り当てられていないターミナル デバイスファイルを O_NOCTTY オプション (open(2) を参照) を使わずにオープンした場合、オープンされたターミナルがそのセッションの制御ターミナルになります。そしてそのセッションのセッションリーダのプロセスグループが、制御ターミナルのフォアグラウンド プロセスグループになります。制御ターミナルがセッションに結び付けられているときは、そのセッションのセッションリーダは、制御ターミナルを制御するプロセスとなります。 fork() (fork(2) を参照) を実行した場合、制御ターミナルは子プロセスに継承されます。 setsid() や setpgrp() を使って新しいセッションを生成した場合 (setsid(2) または setpgrp(2) を参照)、あるいは、制御ターミナルと関連付けられているすべてのファイル記述子がクローズされた場合は、プロセスは制御ターミナルを放棄します。 制御プロセスが終了したとき、制御ターミナルは現在のセッションから切り離され、新しいセッションリーダを得られるようになります。 SIGHUP シグナルは制御ターミナルのフォアグラウンド プロセスグループ中のすべてのプロセスに送られます。それ以降、他のプロセスからターミナルへのアクセスは拒否され (「ターミナルアクセス制御」 を参照)、そのターミナルにはモデム切断が送られたかのように扱われます。 ターミナルアクセス制御制御ターミナルのフォアグラウンド プロセスグループ中のプロセスからは読み取り操作を行うことができます (詳しくは「入力処理とデータ読み取り」 の項目を参照)。制御ターミナルのフォアグラウンド プロセスグループ以外のプロセスと、そのプロセスが属するプロセスグループ中のプロセスは、その制御ターミナルのバックグラウンド プロセスグループに属するものとされます。バックグラウンド プロセスグループ中のプロセスからの制御ターミナルの読み取りは拒否されます。このとき、読み取りを行おうとしたプロセスが SIGTTIN シグナルを無視あるいはブロックしているか、 (vfork が fork とは別に実現されているシステムで) そのプロセスが vfork(2) を呼び出したがまだ exec(2) を呼び出していないか、あるいは、そのプロセスのプロセスグループが親なしであるか、のいずれかの場合は、 read() は errno を EIO に設定して \(mi1 を返し、シグナルは送られません。それ以外の場合は読み取りは拒否され、そのプロセスが属するプロセスグループに SIGTTIN シグナルが送られます。デフォルトでは SIGTTIN シグナルが送られたプロセスは停止します。 制御ターミナルのフォアグラウンド プロセスグループ中のプロセスからは、書き込み操作を行うことができます (「データ書き込みと出力処理」 を参照)。ただし TOSTOP (「ローカルモード」 を参照) が設定されている SIGTTOU シグナルを、無視もブロックもしないか、あるいは (vfork が fork とは別に実現されているシステムで) そのプロセスが vfork(2) を呼び出したが exec(2) はまだ呼び出していないかのどちらかの場合は、バックグラウンド プロセスグループ中のプロセスからの制御ターミナルへの書き込みは拒否されます。 書き込みが拒否され、かつ、バックグラウンド プロセスグループが親なしであるときは、 write() は、 errno を EIO に設定して \(mi1 を戻します。 書き込みが拒否され、かつ、バックグラウンド プロセスグループが親なしではないときは、書き込みを行おうとしたプロセスが属するプロセスグループに SIGTTOU シグナルが送られます。デフォルトでは SIGTTOU シグナルが送られたプロセスは停止します。 ターミナルパラメータを変更する呼び出しは書き込みと同様に扱われますが、その場合、 TOSTOP の設定は無視されます。言い換えれば、 TOSTOP が設定されている場合のターミナルへの書き込みと同様に扱われます。 入力処理とデータ読み取りターミナル デバイスファイルとして扱われるターミナルデバイスは全二重モードで操作することができます。すなわち、データの出力が行われている最中でもデータ入力を受け付けることができます。各ターミナル デバイスファイルは 入力キュー を持ちます。この入力キューには、ターミナルデバイスに着信してプロセスに読み取られる前のデータがシステムによって保存されます。入力キューに保存されるデータの最大文字数は MAX_INPUT で決められます。この最大数はそれぞれの処理系に依存しますが、少なくても 256 以上であることが保証されています。入力がこの最大数に達したとき、保存された文字は通知なしに破棄されます。 入力の処理は正規モードあるいは非正規モードのいずれかで処理されます (「正規モード入力処理」 と「非正規モード入力処理」 を参照)。さらに入力文字の処理方法は c_iflag フィールド (「入力モード」 を参照) と c_lflag フィールド (「ローカルモード」 を参照) に依存します。例えば、ターミナルから受け取った文字を即座にターミナルに書き込むような エコー の処理などがその例です。エコーは全二重モードでの操作によく使われるものです。 ターミナル デバイスファイルからプロセスへのデータの読み取りの方法は、そのターミナル デバイスファイルが正規モードか非正規モードかに依存します。 その他には open(2) や fcntl(2) で O_NONBLOCK フラグや O_NDELAY フラグがセットされているかどうかにも依存します。 O_NONBLOCK フラグと O_NDELAY フラグの両方がクリアされている場合は、読み取りや呼び出しはデータが使用可能な状態になるかシグナルが受け取られるまでブロックされます。 O_NONBLOCK フラグと O_NDELAY フラグのどちらかがセットされている場合は、読み取りや呼び出しはブロックされることなく、以下の 3 つのいずれかの状態で終了します。
データの利用率、有用性、利用価値は、入力処理モードが正規モードであるか非正規モードであるかに依存します。次の項では「正規入力処理モード」 と「非正規入力処理モード」 について説明します。 正規入力処理モード (消去と抹消の処理)正規入力処理モードではターミナルからの入力は行を単位として処理されます。行は改行文字 (NL)、EOF 文字 (EOF)、行終端文字 (EOL) あるいは (EOL2) のどれかで区切られています (NL、 EOF、 EOL、 EOL2 については、「特殊文字」を参照)。この場合、読み取りや呼び出しは、行全体が入力されるかシグナルが受け取られるまで戻りません。また読み取り / 呼び出しで何文字要求されていても、入力は 1 行単位で返されます。しかし実際には、読み取りは 1 行単位で行う必要はなく、何文字単位で読み取りを要求しても (1 文字でも)、データが失われることはありません。 MAX_CANON は 1 行の文字数の上限を表します。この上限はそれぞれの処理系に依存しますが、少なくとも 256 以上であることが保証されています。 1 行中の文字が MAX_CANON を超えたときは、現在の行の中のすべての文字は通知なしに破棄されます。 消去と抹消の処理は、 ERASE 文字 WERASE あるいは KILL 文字 (「特殊文字」を参照) の 3 つの特殊文字が受け取られたときに行われます。この処理はまだ NL、EOF、EOL、EOL2 のどの文字でも区切られていない入力キューの中のデータを操作します。この、どの区切り文字でも区切られていない入力キューの中のデータが、現在 (カーソルが) いる行となります。 ERASE 文字は現在 (カーソルが) いる行中の最後に入力した文字を (もしそれが存在すれば) 消去します。 WERASE 文字は、現在行の最後に入力したワードを (それが存在すれば) 消去します。ここでワードとは空白を除く文字の連続として定義されます (タブは空白として扱われます)。 KILL 文字は現在 (カーソルが) いる行中のすべてのデータを消去し、オプションによっては改行文字 (NL) を出力します。これらの文字はキーを押した時点で処理され、これらの文字に続くバックスペースやタブには影響を与えません。 ERASE 文字、 WERASE 文字と、 KILL 文字は現在 (カーソルが) いる行が空のときは何もしません。 ERASE 文字、 WERASE 文字と、 KILL 文字は入力キューには保存されません。 非正規入力処理モード (MIN/TIME の相互作用)非正規入力処理モードでは、入力文字は行単位で取り扱われることはなく、消去や抹消の処理も行われません。非正規入力処理モードでは、 c_cc 配列 (「termios 構造体」を参照) の MIN と TIME のメンバーの値を用いて、受け取った文字をどのように処理するかが決定されます。 MIN は read() が正常に終了するために必要な最小文字数を表します。 TIME は 0.10 秒刻みのタイマで、短時間に大量のデータが送られてきたときのタイムアウトの設定に使われます。 MIN と TIME の値の相互作用 (組み合せ) には、以下の 4 つの場合があります。 ケース A: MIN > 0, TIME > 0 この場合は TIME は、文字入力のインターバルタイマとして使われ、最初の文字が受け取られるとアクティブ状態になります。この場合のタイマは文字入力のインターバルタイマなので、各文字を受け取るたびにタイマはリセットされます。 MIN と TIME の間の相互作用は以下の通りです。
ケース B: MIN > 0, TIME = 0 このケースでは TIME の値が 0 であるため、タイマは動作せず、 MIN の値だけが意味を持ちます。ペンディング読み取りでは、前の読み取りが終了してから MIN 文字が受け取られるか、シグナルが受け取られるまではブロックされます。このケースでレコードベースのターミナル I/O を行うと、読み取り操作で無限にブロックされることがあります。 ケース C: MIN = 0, TIME > 0 このケースでは MIN の値が 0 であるので、 TIME は文字入力のインターバルタイマではなく、 read() 関数が呼ばれた時点で起動される読み取りタイマとして働きます。 1 つの文字が受け取られるか、あるいは、読み取りタイマが終了した時点で、読み取り条件は満たされます。タイマが終了した場合は文字は返されません。タイマが終了しなかった場合で読み取り条件が満たされるのは、文字が受取られた場合のみです。このケースでは文字の受信を待って読み取りが無限にブロックされることはありません。すなわち、読み取りが始まってから TIME 0.10 秒以内に文字が受け取られなかった場合は、 read() はデータを読み取らず 0 を返します。 ケース D: MIN = 0, TIME = 0 読み取りを指定された文字数と現在使用可能な文字数のうち、少ない方の値が返され、それ以上の文字入力を待つことはしません。使用可能な文字がない場合は、 read() はデータを読み取らずに 0 を返します。 MIN と TIME の相互作用について、さらにいくつか説明します。
この 2 つの点は MIN/TIME が持つ機能の二重性を表しています。ケース A とケース B (いずれも MIN > 0 ) は、短時間に大量のデータが着信するような状況 (例えばファイル転送プログラム。プロセスに対して一度に少なくとも MIN 個の文字の受信が要求されます) を取り扱うことを目的としています。ケース A では文字入力のインターバルタイマはユーザーにとっては一種の安全基準として利用されるのに対して、ケース B ではタイマは利用されません。 ケース C とケース D は 1 文字ずつの時間間隔の空いた入力を取り扱うことを目的としています。これはスクリーンベースのアプリケーションのように、スクリーンを書き換える前に入力キューの中に文字が存在するかどうかの判断が必要な用途に適しています。ケース C では読み取りはタイマ制御されるのに対して、ケース D では読み取りはタイマ制御されません。 さらに MIN は読み取るデータの長さではなく、常に最小値を指定するという点にも注意してください。例えば、あるプログラムが 20 文字を指定して読み取りを起動し、そのとき MIN が 10 で入力キューに 25 文字のデータがあった場合、ユーザーには 20 文字が返されます。プログラムがすべての文字を読み取るように指定していた場合は、25 文字すべてがユーザーに返されます。 さらに TIME が 0 より大きく MIN が MAX_INPUT より大きい場合は、 MIN 文字を受け取ろうとしても MAX_INPUT を超えた文字は通知なしに破棄されるため、読み取りは終了できなくなってしまいます。 TIME が 0 で MIN が MAX_INPUT より大きい場合は、シグナルを受け取らない限り、読み取りは終了できなくなります。 特殊文字ある特定の文字は入力、出力、あるいはその両方において特別な意味を持ちます。特に断わりがない限り、各特殊文字は変更したり使用不能にしたりすることができます。文字を使用不能にする場合にはその値を _POSIX_VDISABLE に設定します (unistd(5) を参照)。これらの特殊な機能とそのデフォルトの文字は以下の通りです。
端末のポートがオープンされたときには、特殊文字には、デフォルトの文字の値が割り当てられます。デフォルトの値は、System V Interface Definition, Third Edition (SVID3) で指定されています。ただし、 WERASE (Ctrl-W) および LNEXT (Ctrl-V) の各文字に関しては、 _POSIX_VDISABLE に設定されています。これは、過去の HP-UX のリリースとのバイナリ互換性を保つためです。ポートのオープン時に割り当てられるデフォルトの文字の値は stty コマンド (stty(1) 参照) により、システム全体の全ポートに対して変更可能です。この文字の値は、特定のポートに対しても、オープンされているときに stty コマンドを使うことによって変更できます。 NL、CR の各文字を変更したり、使用不能にすることはできません。残りの特殊文字に対する各文字の値は各自の好みで変更したり、使用不能にすることができます。 ICANON がセットされている場合は (「ローカルモード」を参照)、 ERASE、KILL、EOF の各文字は、その前に \ 文字を付けることによりエスケープすることができ、この場合は特殊機能は働きません。これらの文字と残りの特殊文字は、 LNEXT 文字 (上の LNEXT を参照) を前に置くことにより、エスケープすることができます。 複数の特殊機能が同じ文字に割り当てられている場合、その文字が入力された場合にどの特殊機能が働くかは定義されません。 モデム切断モデムの切断が制御ターミナルのターミナルインタフェースによって検出され、かつ、ターミナルの c_cflag フィールド (「制御モード」 を参照) 中の CLOCAL がクリアされている場合は、 SIGHUP シグナルが制御ターミナルの制御プロセスに送られ、(特に設定が変更されていない限り) 制御プロセスは終了させられます。それ以降のそのターミナルデバイスからの読み取りではすべて、デバイスがクローズされるまでファイル終了指示子が返されます。したがって、モデム切断の後に、ターミナルに対する読み取りを行い、EOF が返されるかどうかをチェックしていたプロセスを終了させることができます。ターミナルデバイスに対する write() は、デバイスがクローズされるまで errno を EIO に設定して \(mi1 を返します。 ターミナル デバイスファイルのクローズターミナル デバイスファイルをクローズしようとするプロセスは、そのデバイスにまだ送られずにいるすべての出力をデバイスに送ります。これは出力が中断されていても行われます。この最後のクローズは、たとえノンブロッキング I/O が指定されていても、すべての出力がターミナルデバイスに送られるまでは常にブロックされます。受信されてはいるが、まだ読み取られていない入力はすべて破棄されます。 データ書き込みと出力制御文字が書き込まれた場合、そのデータは出力キューに格納されます。出力キュー中の文字は、その前に書かれた文字が出力されるとすぐにターミナルへ送られます。これらの文字の処理方法は c_oflag フィールド (「出力モード」 を参照) の設定に依存します。入力された文字はその順に出力キューに送られることによってエコーされます。プロセスの出力が速いためにその送信処理が追い付かず、出力キューの容量を超えた場合、そのプロセスは中断されます。そしてキューに格納された文字の量があるしきい値以下になったら、そのプロセスは再開されます。 termios 構造体<termios.h> ヘッダファイルで定義される termios 構造体を用いると、ターミナルの I/O の動作を制御するルーチンが使用可能になります。この構造体は次のように定義されます。 #define NCCS 16 特殊文字は配列 c_cc で定義されます。各特殊文字の相対位置とデフォルト値は以下の通りです。
termio 構造体termio 構造体は termios 構造体によって置き換えられたもので、旧製品との互換性のために用意されているものです (「termio に関する警告」を参照)。この構造体は > ヘッダファイルで以下のように定義されています。 #define NCC 8 モード以下の 4 つの項目はそれぞれ termios および termio 構造体 (「termio に関する警告」を参照) を用いて設定できるターミナルの性質について説明します。以下で明示的に定義されていないモードのフィールド中のビットは無視されますが、将来の互換性の問題を避けるためには、常にクリアしておく必要があります。 入力モードc_iflag フィールドは基本的なターミナル入力の制御の設定に使われます。
ブレーク条件は、ある一定時間以上続けて送信される値 0 のビットの列として定義されます。例えばすべてのデータが 0 である文字フレーミングやパリティエラーは、1 つのブレーク条件として処理されます。 IGNBRK がセットされている場合は、ブレーク条件は無視されます。したがってブレーク条件がプロセスに読み取られることはありません。 IGNBRK がクリアされ BRKINT がセットされている場合は、ブレーク条件は入力キューと出力キューの両方を吐き出し、もしそのターミナルがフォアグラウンド プロセスグループの制御ターミナルであるならば、ブレーク条件はフォアグラウンド プロセスグループに SIGINT シグナルを 1 つ送出します。 IGNBRK と BRKINT のどちらもセットされていない場合は、ブレーク条件は通常の 1 つの 文字として読まれます。 PARMRK がセットされている場合は \377, , のような 3 文字の列として読まれます。 IGNPAR がセットされている場合は、フレーミングや (ブレーク以外の) パリティエラーの文字は無視されます。 PARMRK がセットされ IGNPAR がクリアされている場合は、フレーミングや (ブレーク以外の) パリティエラーの文字は、 \377, , X (X にはエラーとして受け取った文字のデータが入る) のような 3 文字の列として読まれます。 このとき X はエラーとして受け取った文字のデータが入ります。 ISTRIP がクリアされている場合、正当な \377 という文字は \377, \377 のように読まれます。 PARMRK と IGNPAR の両方がクリアされている場合、フレーミングや (ブレーク以外の) パリティエラーの文字は 文字という文字として読まれます。 INPCK がセットされているときは、入力時のパリティチェックが行われます。 INPCK がクリアされているときは、入力時のパリティチェックは行われません。入力時のパリティチェックが行われるかどうかはパリティ検出を行うかどうかとは関係ありません (「制御モード」 を参照)。 PARENB がセットされ (「制御モード」 を参照) INPCK がクリアされている場合は、パリティ生成が行われますが、入力時のパリティチェックは行われません。すなわち、ターミナルが接続されているハードウェアはパリティビットの認識はしますが、そのターミナルの特殊ファイルは、そのビットが正しいかどうかのチェックをしないということです。 以降の表は IGNBRK、BRKINT、IGNPAR、PARMRK の各フラグ間の関係を表しています。 Input のカラムに書かれている文字は、以下のようなさまざまなタイプの入力文字を表します。
大かっこで囲まれたものは複数の条件が正しいことを表します。 INPCK フラグがクリアされている場合は、パリティエラーで受け取られた文字はこの表の通りには処理されず、パリティエラーが起きていない場合と同様に取り扱われます。各フラグのカラムでは、 Set はフラグがセットされていることを、 Clear はフラグがセットされていないことを、 X はフラグがセットされていてもいなくてもかまわないことを表します。 Read のカラムはアプリケーションコードに渡される文字を示します。\(em はアプリケーションコードには文字や条件が渡されないことを示します。この値が SIGINT と書かれている場合は、文字は渡されずに SIGINT シグナルが制御ターミナルのフォアグラウンド プロセスグループに送られます。
ISTRIP がセットされている場合は、入力された文字の上位 1 ビットが除去され、下位 7 ビットのみが有効になります。 ISTRIP がセットされていない場合は 8 ビットすべてが有効です。 INLCR がセットされているとき NL 文字は CR 文字に変換されます。 IGNCR がセットされているとき CR 文字は無視されます (読み取られません)。 IGNCR がクリアされ ICRNL がセットされているときは、 CR 文字は NL 文字に変換されます。 IUCLC がセットされているときは、受け取った大文字のアルファベット文字は小文字に変換されます。 IXON がセットされている場合は、start/stop の出力制御が行われます。 すなわち、 STOP 文字を受け取ると出力は中断し、 START 文字を受け取ると中断された出力を再開します。 IXANY\c 、IXON がセットされている場合は、フレーミングやパリティエラーのない文字が入力されると、 中断出力を再開します。これらの 2 つのフラグがセットされており、 出力が中断されていて、かつ、フレーミングあるいはパリティエラーがある文字が入力されると、 その文字を処理した結果データが読み取られた場合のみ出力は再開されます。 IXON がセットされているときは、 START、STOP の 2 つの文字はデータとして読まれることはなく、単にフロー制御を行います。 IXON がクリアされているときは、 START 、STOP の 2 つの文字はデータとして読まれます。 IXOFF がセットされている場合は、入力時の start/stop 制御が行われます。 入力キュー中の文字の数がシステムで定義されたの上限値を超えたとき、システムは STOP 文字を送信します。これは入力キューの容量 (MAX_INPUT\c ) を超える文字を受け取る前に、 ターミナルデバイスにデータの転送を中断させるために利用されます。 その後入力キューから文字が読み取られ、 入力キュー中の文字数がシステムで定義されたの下限値を下回った時点で、 システムは START 文字を送信し、ターミナルデバイスは (入力キューのオーバフローの心配なく) データ転送を再開します。 またデッドロックの可能性を避けるために、 正規モードで入力バッファ中に行の区切りが存在しない場合は、 IXOFF は無視されます。 この場合 STOP 文字は、入力キュー中の文字数が上限値に達したときではなく、 それ以降で行区切りが受け取られた時点で送信されます。入力キュー中の文字 (行区切りを持つ) 完全な行がすべて読み取られて、 行区切りのない入力途中の行のみがある場合は、 入力キュー中の文字数が下限値に達していなくても START 文字が送られます。 ICANON がセットされていて、 入力ストリーム中の行区切りの間の文字数が上限値を超えている場合は、 STOP 文字がタイミングよく送られないか、あるいはまったく送られないこともあるので、 IXOFF がバッファのオーバフローやデータ損失を防げるという保証はありません。 IMAXBEL が設定されている場合、入力キューがあふれると ASCII BEL 文字がエコーされます。これ以降の入力は保持されませんが、入力キューにあるものはそのまま保持されます。 IMAXBEL が設定されていないと、 ASCII BEL はエコーされず、入力キューがあふれたときには入力キューにはいっているものは廃棄されます。 入力制御フラグの初期値はすべてクリアされた状態です。 出力モードc_oflag フィールドはシステムの出力処理の取り扱いの設定に使われます。
OPOST がセットされている場合は、残りのフラグで指定された後処理を出力文字に対して行います。 OPOST がセットされていない場合は文字に対する変更は行われません。 OLCUC がセットされている場合は、出力文字を小文字から大文字に変換します。この機能は IUCLC との組み合せでよく使用されます。 ONLCR がセットされている場合、 NL 文字は CR-NL 文字のペアに変換されます。 OCRNL がセットされている場合、 CR 文字は NL 文字に変換されます。 ONOCR がセットされている場合、現在のカラムが 0(行の先頭) のときは CR 文字は出力されません。 ONLRET がセットされている場合、 NL 文字はキャリッジリターン処理を行うものとして処理されます。すなわちカラムポインタは 0 に設定され、 CR がディレイに用いる値を使ってディレイします。 ONLRET がセットされていない場合は、 NL 文字は単にラインフィードの動作のみを実行します。すなわち NL は指定された値でディレイし、カラムポインタは変更されません。すべての場合でカラムポインタは CR 文字が送られてきた時点で 0 に設定されます。 ディレイビットは、ある文字がターミナルに送られたときに、どのくらいの長さ転送を中断するかを指定します。この中断は出力装置の機械的な、あるいはその他の動作のための時間を想定しています。 NL0、CR0、TAB0、BS0、VT0、FF0 のそれぞれの値はディレイしないことを意味します。 OFILL がセットされている場合は、充填文字が時間指定のディレイの代りに出力されます。これはボーレートの高いターミナルなどを使っている場合に最小のディレイで十分なときに役立ちます。 OFDEL がセットされている場合は、通常の充填文字である NUL の代りに DEL が送られます。 書式送りと垂直タブのディレイが指定されている場合は約 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 つ送られます。 実際のディレイは回線速度やシステムの負荷に依存します。 出力制御の各フラグの初期値はすべてクリアされた状態です。 制御モードc_cflag フィールドターミナルのハードウェア制御の設定を行います。
CBAUD ビットはボーレートを指定します。ボーレート 0 を表す B0 は、連結をハングアップするのに使用されます。 B0 が指定されている場合、これはモデム制御回線 (modem(7) を参照) の終了を意味し、通常、回線は切断されます。ある特定のハードウェアでは、ボーレートを変更できない場合もあります。 CBAUD は termio 構造体とともに使用されます。 termios 構造体を使う場合は、入出力のボーレートの参照や変更のために使用可能なルーチンが用意されています (「termios 構造体関連の関数」を参照)。 CSIZE ビットは入出力時の文字のビットサイズを指定します。このビットサイズはパリティビットの分を含みません。 CSTOPB がセットされている場合は、ストップビットとして 2 ビットが、セットされていない場合は 1 ビットが使用されます。例えば 110 ボーで使用する場合、多くのデバイスは 2 ストップビットを必要とします。 PARENB がセットされている場合はパリティの生成が可能になり、出力される各文字にパリティビットが付加されます。さらに、パリティの検出も可能になり、入力される各文字のパリティが正しいかどうかチェックされます。 PARENB がセットされているときで、 PARODD がセットされている場合には、奇数パリティが用いられ、 PARODD がセットされていない場合は偶数パリティが使用されます。 PARENB がクリアされている場合はパリティの生成もパリティチェックも行われません。 CREAD がセットされている場合にのみ入力の受信が可能です。 CREAD をクリアすると入力した文字は受信されません。 HUPCL と CLOCAL ビットの意味は、モデム制御のモードとタイプに依存します。詳しくは modem(7) を参照してください。 HUPCL がセットされている場合は、最後にポートをオープンしたプロセスがそのポートをクローズするか、プロセス自身が終了した時点で、そのポートのモデム制御回線が切断されます。 CLOCAL がセットされている場合は、連結はモデム ステータスラインの状態に依存します。 CLOCAL がクリアされている場合は、モデム ステータスラインはモニタされます。 通常の状況では read() の呼び出しはモデム接続が終了するまでブロックされます。しかし O_NDELAY フラグと O_NONBLOCK フラグのいずれかがセットされているか、 CLOCAL がセットされている場合は、 open() は連結を待たずにただちに終了します。 CLOCAL がセットされている場合の、連結がまだなされていない、あるいは連結が切れてしまったファイルに対する read() と write() の効果については「モデム切断」 を参照してください。 LOBLK はシェルレイヤ機能で使用されます (shl(1) を参照)。シェルレイヤ機能は一般のターミナルインタフェースの一部ではなく、一般のターミナルインタフェースは LOBLK ビットを使用しません。 ターミナルのオープン直後のハードウェア制御フラグの初期値は、 B300、CS8、CREAD、HUPCL となっています。 ローカルモードc_lflag フィールドはターミナルの制御に使用されます。
ISIG がセットされている場合は、各入力文字が INTR、QUIT、SUSP、DSUSP などの特殊制御文字 (「プロセスグループ制御 IOCTL コマンド」を参照) であるかどうかをチェックします。もし入力文字がこれらの制御文字であった場合は、その文字に対応する機能が実行され、その文字はデータとしては読み込まれません。 ISIG がセットされていない場合はチェックは行われず、通常のデータ文字として取り扱われます。つまりこれらの特殊入力機能は ISIG がセットされているときにのみ使用可能です。 ICANON がセットされている場合は正規入力モードでの処理が行われます。すなわち消去や抹消などの編集機能が働き、 NL、EOF、EOL、EOL2 で区切られた入力文字行の編集が可能になります。 ICANON がクリアされている場合は、読み取りは直接入力キューから行われます。読み取りの際は、 MIN で指定された文字数が受け取られるか、あるいは入力される文字の間で TIME で指定されたタイムアウト値が終了するまでブロックされます (「非正規入力処理モード (MIN/TIME の相互作用)」を参照)。これにより 1 文字入力の場合でも、連続する大量の入力を効率よく受け取ることが可能になります。時間の指定は 0.10 秒単位です。 XCASE がセットされていて、かつ ICANON がセットされている場合は、 \ 文字に続いて入力された文字は大文字として読み込まれ、また出力時にも \ 文字に続いて出力されます。このモードでは、入出力時に次のエスケープシーケンスを使用することができます。
例えば A と入力する場合は \a と、 \n と入力する場合は \\n と、 \N と入力する場合は \\\n と入力してください。 XCASE は通常 IUCLC と OLCUC の組み合せで文字セットが 64 文字に制限されたターミナルを使用するときに使われます。この場合は、入力時には XCASE の処理が行われる前に IUCLC の処理が行われ、出力時には XCASE の処理が行われた後に OLCUC の処理が行われます。したがって A という入力は IUCLC 処理によって a に変換されます。 \A という入力は、まず IUCLC がこれを \a に変換し、次に XCASE がこれを A に変換します。 ECHO がセットされている場合、文字は受け取られた時点でターミナルにエコーされます。 ECHO がクリアされている場合は、文字はエコーされません。 ICANON がセットされている場合は正規入力モードで処理されます。この場合は、「正規入力処理モード」 の項ですでに説明したように消去や抹消の編集機能が利用でき、 NL、EOF、EOL、EOL2 で区切られる入力文字の行を編集することができます。さらに次のエコー機能が利用できます。 ECHO と ECHOE がセットされている場合、 ERASE、WERASE を入力すると BS SP BS という 3 つの ASCII 形式の文字の列をエコーし、 CRT スクリーン上の最後の文字を消去します。 ECHO と ECHOPRT がセットされており、 ECHOE がクリアされている場合、シーケンス中の最初の ERASE および WERASE 文字は、バックスラッシュ (\) をエコーし、そのあとに消去される文字 (列) が続きます。さらに ERASE あるいは WERASE 文字が続くと、削除された文字 (列) が逆順にエコーされます。次の非消去文字によって、それがエコーされる前に、スラッシュ (/) がタイプされます。 ECHOKE および ECHO がセットされていると、 KILL 文字は ECHOE および ECHOPRT によって指定された方法を使って CRT スクリーン上の行の各文字を消去します。 ECHOCTL および ECHO がセットされていると、 ASCII TAB、ASCII NL、START および STOP 文字、 ASCII CR、および ASCII BS を除くすべての制御文字 (8 進で 0 から 37 の間のコードを持つ文字) が ^char でエコーされます。ここで char は制御文字のコードに 8 進の 100 を足したコードを持つ文字です。 ECHOK がセットされ ECHOKE がセットされていない場合、その行が削除されていることを強調するため、 NL 文字が、行抹消文字のあとにエコーされます。 ECHONL がセットされている場合は、 ECHO がクリアされている場合でも NL 文字がエコーされます。これはターミナルがローカルエコー (つまり半 2 重) に設定されているときに有用です。 エスケープされない限り EOF 文字はエコーされません。 ASCII EOT がデフォルト EOF 文字として指定されているため、 EOT によってターミナルがハングアップすることは避けられます。 NOFLSH がセットされている場合は、通常の入出力キューの quit、割り込み、中断に伴うフラッシュは行われません。しかし BRKINT がセットされている場合のブレークの受信に伴うデータのフラッシュには、 NOFLSH は影響を与えません。 TOSTOP ビットがセットされていて、かつ、そのプロセスが SIGTTOU シグナルを無視あるいはブロックしない場合、フォアグラウンド プロセスグループに入っていないプロセスが制御ターミナルに書き込もうとすると拒否されます。もし書き込みが拒否され、そのプロセスが親なしのプロセスグループに属する場合は、 write() は errno を EIO にセットし \(mi1 を返し、シグナルは送られません。もし書き込みが拒否され、そのプロセスが親なしのプロセスグループに属していない場合は、 SIGTTOU シグナルがそのプロセスグループに送られます。 FLUSHO がセットされている場合、ターミナルデバイスに書かれたデータは廃棄されます。このビットはプログラムによってセットされます。 FLUSHO をクリアすることによって、プログラムで FLUSHO の効果をなくすることができます。 PENDIN がセットされている場合、次の文字が入力として着信したときに、読まれていなかった入力は再処理され、再度エコーされる可能性があります。 ICANON がセットされているときは ERASE、KILL、EOF の各文字はその前に \ 文字を付けることによってエスケープでき、この場合は特殊機能は実行されません。 IEXTEN は、 ECHOCTL、ECHOPRT、ECHOKE、FLUSHO、および PENDIN 機能を許可する前にセットしなければなりません。また、特殊文字 WERASE および LNEXT は IEXTEN がセットされたときにのみ許可されます。 IEXTEN は、他のいかなる機能にも影響しません。 ローカル制御のフラグの初期値はすべてのビットがクリアされた状態です。 特殊制御文字特殊制御文字は c_cc 配列で定義されます。すべての特殊文字は変更することができます。正規モードと非正規モードでの各要素の名前と説明を次の表に示します。
termios 構造体関連の関数以降の関数は termios 構造体を使用するときに使われる関数です。関数 cfsetispeed() および cfsetospeed() のターミナルデバイスへの効果は、 tcsetattr() 関数が正常に呼び出されるまで有効になりません。これらの関数についての詳細はマニュアルの各エントリを参照してください。
termio 構造体関連の IOCTL コマンドioctl() システムコールには termio 構造体を使用してターミナルファイルを操作するものがいくつかあります (「termio 構造体」を参照)。このとき要求されたコマンドを認識できない場合は、 errno を EINVAL に設定して \(mi1 を返します。 termio 構造体を参照する ioctl() システムコールは次のような形式になります。
この形式で使われるコマンドは、以下の通りです。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||