伝送制御手順モジュール
ldterm 伝送制御手順は、端末に共通の伝送制御手順です。
この伝送制御手順は POSIX に準拠しており、BSD インターフェースとの互換性も確保されています。 後者の伝送制御手順は、旧アプリケーションとの互換性を持たせるためだけにサポートされているものです。 移植性という点で、新しいアプリケーションでは POSIX インターフェースの使用を強くお勧めします。
この項では、ldterm 伝送制御手順が提供する 機能について説明します。 ldterm の制御について詳しくは、「ファイル参照」の『termios.h File』を参照してください。
ldterm 伝送制御手順についてさらに詳しく学びたい場合は、 以下の資料をお読みください。
端末パラメーター
ある端末の入出力特性を制御するパラメーターは、termios.h ファイルで定義されているように、termios 構造体で指定されます。 termios 構造体には、以下のメンバーが 組み込まれています (ただし、これだけというわけではありません)。
- tcflag_t c_iflag
- 入力モード
- tcflag_t c_oflag
- 出力モード
- tcflag_t c_cflag
- 制御モード
- tcflag_t c_lflag
- ローカル・モード
- cc_t c_cc[NCCS]
- 制御文字
tcflag_t および cc_t 符号なし整数の タイプが termios.h ファイルに定義されています。 NCCS シンボル も termios.h ファイルに定義されています。
プロセス・グループ・セッション管理 (ジョブ制御)
制御端末は、関連付けられているセッション内で、 フォアグラウンド・プロセス・グループとなる 1 つのプロセス・グループを識別します。 セッション内の他のプロセス・グループは、すべてバックグラウンド・プロセス・グループと指定されます。 フォアグラウンド・プロセス・グループは、シグナル処理において特別な役割を果たします。
Korn シェル (ksh コマンド) および C シェル (csh コマンド) などの、 ジョブ制御をサポートするコマンド・インタープリター・プロセスは、関係するプロセスを単一のプロセス・グループに入れ、 このプロセス・グループを端末に関連付けることによって、端末を別のジョブ 、 またはプロセス・グループに割り当てることができます。 端末のフォアグラウンド・プロセス・グループは、アクセス権の要件が満たされたものと想定して、 プロセスによって設定または検査することができます。 端末ドライバーは、フォアグラウンド・プロセス・グループ内にないプロセスによる端末へのアクセスを 制限することによって、ジョブ割り当てを補助します。
端末アクセス制御
制御端末のフォアグラウンド・プロセス・グループ内にないプロセスが制御端末からの読み取りを試みると、 そのプロセスのプロセス・グループに SIGTTIN シグナルが送信されます。 ただし、読み取っているプロセスが SIGTTIN シグナルを無視するか、または ブロックしている場合、または読み取っているプロセスが孤立している場合、 読み取り要求は -1 という値を戻し、errno グローバル変数を EIO に設定して、 シグナルの送信は行いません。
制御端末のフォアグラウンド・プロセス・グループ内にないプロセスが制御端末への書き込みを試みると、 そのプロセスのプロセス・グループに SIGTTOU シグナルが送信されます。 ただし、SIGTTOU シグナルの管理は、termios 構造体 の c_lflag フィールドで定義されている TOSTOP フラグ によって決まります。 TOSTOP フラグが設定されていない場合、 あるいは TOSTOP フラグが設定されていてプロセスが SIGTTOU シグナルを 無視するかブロックしている場合は、そのプロセスは端末への書き込みを行うことが でき、SIGTTOU シグナルは送信されません。 TOSTOP フラグが設定されていて、書き込みを行っているプロセスのプロセス・グループが 孤立していて、しかも書き込みを行っているプロセスが SIGTTOU シグナルを無視しないか、 またはブロックしない場合は、書き込み要求は -1 という値を戻し、errno グローバル変数 を EIO に設定して、シグナルの送信は行いません。
端末パラメーター (tcsetattr、tcsendbreak、tcflow、 および tcflush) を設定する、ある特定の関数は、書き込み要求と同じ方法で扱われます。 ただし、TOSTOP フラグは無視されます。 効果は、TOSTOP フラグが設定されている場合の端末書き込み要求の効果と同じです。
データの読み取りと入力処理
端末デバイス・ファイルが標準モードか非標準モードかに応じて、一般的には 2 種類の入力処理を使用することができます。 さらに入力文字は、c_iflag および c_lflag の 各フィールドに従って処理されます。 このような処理には、エコー、あるいは送信元端末への入力文字の即時の返送を 組み込むことができます。 エコーは、全二重モードで稼働可能な端末に対しては有効です。
読み取り要求は、O_NONBLOCK フラグが open また は fcntl のいずれのサブルーチンによって設定されているかに応じて、2 とおりの 方法で処理することができます。 O_NONBLOCK フラグが設定されていない場合は、 データが使用可能になるまでまたはシグナルを受信するまで、読み取り要求はブロックされます。 O_NONBLOCK フラグが設定されている場合は、読み取り要求はブロックされずに、 次の 3 とおりの方法のうちの 1 つの方法で完了します。
- 要求全体を満たすだけの十分な使用可能データがある場合は、 読み取り要求は正常に完了して、読み取ったバイト数を戻します。
- 要求全体を満たすだけの十分な使用可能データがない場合は、 読み取り要求は可能なかぎりのデータを読み取って正常に完了し、読み取れたバイト数を戻します。
- 使用可能なデータがない場合は、読み取り要求は値 -1 を戻して、errno グローバル変数を EAGAIN に設定します。
データの可用性は、入力処理モードが標準か非標準かによって異なります。 標準モードまたは非標準モードは、stty コマンドを用いて設定することができます。
標準モードの入力処理
標準モードの入力処理 (termios 構造体の c_lflag フィールド で ICANON フラグが設定されている) では、端末の入力は行単位で処理されます。 1 行は、 改行 (ASCII LF) 文字、ファイルの終わり (EOF) 文字、または行の終わり (EOL) 文字で区切られます。 これは、読み取りを試行しているプログラムは、1 行全体の入力が終わるまで、あるいは シグナルの受信が終わるまでブロックされるということです。 また、読み取り要求で指定された文字の数に関係なく、1 行しか戻されないということです。 ただし、一度に 1 行全体を読み取る必要はありません。 1 つの読み取り要求で何文字を指定しても、情報が失われることはありません。 入力中に、消去および削除処理が行われます。
- ERASE 文字
- (デフォルトではバックスペース文字) 入力された最後の文字を消去します。
- WERASE 文字
- (デフォルトでは Ctrl-W キー・シーケンス) 現在行で入力された最後のワードを消去します。 ただし、先行スペースやタブは消去しません。
(ワード は、一連の非ブランク文字として定義されています。 タブは、ブランクと見なされます。) ERASE 文字も WERASE 文字も、その行の先頭より前の文字を消去することはありません。
- KILL 文字
- (デフォルトでは Ctrl-U シーケンス) 入力行全体を削除し、 オプションで復帰改行文字を出力します。
これらの文字はすべて、キー・ストロークをベースとして作動するものであり、 実行された後退やタブとは無関係に行われます。
- REPRINT 文字
- (デフォルトでは Ctrl-R シーケンス) 改行の後ろに、読み込まれていない 直前の行の文字を続けて印刷します。
通常はスクリーンから消去される文字がプログラムの出力によって汚された場合にも、 再印刷は自動的に行われます。 文字は、エコーされたのと同様に再印刷されます。 そのため、termios 構造体の c_lflag フィールド に ECHO フラグが設定されていないと、文字は印刷されません。 ERASE 文字および KILL 文字は、それらの前にエスケープ文字 ¥ (円記号) を入れることにより、 そのままの文字として入力することができます。この場合、エスケープ文字は読まれません。 ERASE、WERASE、および KILL 文字は変更することができます。
非標準モードの入力処理
非標準モードの入力処理 (termios 構造体の c_lflag フィールド で -ICANON フラグが設定されている) では、入力バイトは行に組み込まれず、 消去および削除処理は行われません。
- MIN
- 読み取り要求が正常に行われた場合に受け取ることになる、最小バイト数を表します。
- TIME
- バーストおよび短時間のデータ送信のタイムアウトに使用する、0.1 秒刻みのタイマー。
c_cc 配列の MIN および TIME メンバーの値は、 受け取ったバイトの処理方法を決定する際に使用されます。 MIN および TIME の値は、stty コマンドを 用いて設定することができます。 MIN および MAX の値は 0 から 265 です。 MIN と TIME およびそれらの相互作用について、 可能な 4 つの組み合わせをこの後の段落で説明します。
ケース A: MIN0、TIME0
この場合、TIME はインターバイト・タイマーの働きをします。 これは、先頭バイトの受信後に活動開始となり、バイトが受信されるたびにリセットされます。 インターバイト・タイマーが満了する前に MIN の数のバイトの受信が終われば、 読み取り要求は満たされています。 MIN の数のバイトを受信し終わらないうちにタイマーが満了した場合、 その時点までに受信された文字がユーザーに戻されます。 TIME が満了した場合、少なくとも 1 バイトは戻されます。 (1 バイトでも受信されていなければ、タイマーは使用可能になっていません。) 先頭バイトの受信によって MIN および TIME 機構が活動開始されるまで、 またはシグナルを受信するまでは、読み取り操作はブロックされます。
ケース B: MIN0、TIME = 0
この場合、有効なのは MIN だけです。タイマーは有効ではありません (TIME の値が 0 です)。 保留中の読み取り要求は、MIN の数のバイトが受信されるまで、またはシグナルを受信するまで 実行されません (ブロックされます)。 このケースを使用してレコード・ベースの端末入出力を読み取るプログラムは、 読み取り操作で無期限にブロックされる可能性があります。
ケース C: MIN = 0、TIME0
この場合、MIN の値が 0 であるため、TIME はインターバイト・タイマーを表していません。 この場合は、読み取り要求が処理されたとき、ただちに活動開始になる読み取りタイマーの働きをします。 読み取り要求は、バイトが受信された直後、または読み取りタイマーが満了した時点で実行されます。 タイマーが満了した場合は、戻されるバイトがないということに注意してください。 タイマーが満了しない場合、読み取り要求はバイトを受信した場合にのみ実行されます。 この場合、読み取り操作は、バイトを待って無期限にブロックすることはありません。 読み取り要求が開始された後、TIME に 0.1 秒を掛けた値で指定された期間内に バイトが受信されなかった場合、読み取り要求はデータの読み取りを行わずに 0 という値を戻します。
ケース D: MIN = 0、TIME = 0
この場合、要求されたバイト数または現在使用可能なバイト数のいずれか少ない方が戻され、 さらに多くのバイト数の入力を待ちません。 使用可能な文字がない場合、読み取り要求は、データの読み取りを行わずに 0 という値を戻します。
A と B のケースは、少なくとも MIN 変数で指定された文字数を一度に処理する必要のある、 ファイル転送プログラムなどのバースト・モード・アクティビティーを操作する場合に存在します。 ケース A では、インターバイト・タイマーは安全基準として活動開始されます。 ケース B では、タイマーはオフに切り換えられます。
C と D のケースは、1 文字に限定された転送を操作する場合に存在します。 これらのケースは、スクリーンを再表示する前に入力キュー内に文字があるかどうかを 知る必要のある、スクリーン・ベースのアプリケーションに容易に適用できます。 ケース C では、タイマーは活動化されます。 ケース D では、タイマーはオフに切り換えられます。 ケース D では、パフォーマンスはよくありませんが、 O_NONBLOCK フラグを設定して 読み取り要求を実行するよりは良い方法です。
データの書き込みと出力処理
1 文字または複数の文字を書き込むと、それらの文字は、前に書き込まれた文字が 表示された直後に端末に送信されます。 (入力文字は、到着時に出力キューに入れることによってエコーされます。) プロセスが、表示可能な速度より速く文字を作成した場合、出力キューがある特定の限度を超過すると、 そのプロセスは延期されます。 キューがある特定のしきい値になるまでドレーンされると、プログラムが再開されます。
モデム管理
termios 構造体の c_cflag フィールド に CLOCAL フラグが設定されている場合は、接続がモデム状況表示行の 状態によって変わるということはありません。 CLOCAL フラグがクリアされている場合は、 モデム状況表示行がモニターされます。 通常の環境の下では、オープン機能はモデム接続が 完了するまで待ちます。 ただし、O_NONBLOCK または CLOCAL フラグが 設定されている場合は、オープン機能は接続を待たずにただちに戻ります。
termios 構造体の c_cflag フィールド に CLOCAL フラグが設定されておらず、制御端末用の端末インターフェースによって モデムの切断が検出された場合は、その端末に関連付けられている制御プロセスに SIGHUP シグナルが 送信されます。 その他の方法が準備されていないかぎり、このシグナルによってプロセスは終了します。 SIGHUP シグナルが無視されるか、またはキャッチされると、 その端末がクローズされるまで、以降の読み取り要求はファイルの終わり指示を戻します。 以降の端末への書き込み要求は、そのデバイスがクローズされるまで、-1 という値を 戻し、errno グローバル変数を EIO に設定します。
端末デバイス・ファイルのクローズ
端末デバイス・ファイルをクローズする最後のプロセスによって、出力はデバイスに送信され、 入力されたものは廃棄されます。 次いで、termios 構造体の c_cflag フィールド に HUPCL フラグが設定されていて、かつ、通信ポートが切断機能をサポートしている場合は、 端末デバイスが切断を実行します。