第7版Unix端末インターフェースは、プログラム用のアプリケーションプログラミングインターフェースと、ユーザーの動作期待値の両方を含む、第7版Unixで歴史的に利用可能であった端末の一般化された抽象化です。これは、 POSIX端末インターフェースによって大部分が置き換えられました。
概念と概要
Seventh Edition Unix およびUNIX/32Vで提供され、BSDバージョン 4でも旧端末ドライバとして提供された端末インタフェースは、主にテレタイプライタを端末として使用することを想定したシンプルなものでした。入力は 1 行ずつ行われ、オペレーティングシステム内の端末ドライバ (端末自体ではなく) が簡単な行編集機能を提供していました。編集はカーネルによってバッファが維持され、そこで行われました。端末入力を読み取るアプリケーションは、return行編集を終了するキーが端末上で押されたときにのみ、バッファの内容を受け取りました。端末からシステムに送信されるキーは、編集バッファの現在の内容全体を消去 ("kill") し、通常は ' ' 記号に続いて改行シーケンスとして表示され、印刷位置を新しい空白行に移動します。端末からシステムに送信されるキーは、編集バッファの末尾の最後の文字を消去し、通常は「」記号として表示されます。これは、前の文字を「消去」することを意味するため、ユーザーはこれを認識する必要があります(テレタイプライターは、紙に印刷された文字を物理的に消去することはできません)。[1] [2] [3] [4] [5]@@##
プログラミングの観点から見ると、端末デバイスには、送信および受信ボーレート、"erase" および "kill" 文字 (前述のように行編集を実行する)、"interrupt" および "quit" 文字 (端末が制御端末となっているすべてのプロセスに信号を生成する)、"start" および "stop" 文字 (ソフトウェアフロー制御に使用)、"end of file" 文字 (システムコールによってバッファから破棄されるためread()、長さがゼロの結果が返される可能性があることを除けばキャリッジリターンのように動作する)、およびカーネルの端末ドライバによってローカルエコーがエミュレートされるかどうか、モデムフロー制御が有効かどうか、さまざまな出力遅延の長さ、キャリッジリターン文字のマッピング、および 3 つの入力モードを決定するさまざまなモードフラグがありました。[6]
入力モード
第 7 版 Unix の端末には次の 3 つの入力モードがありました。
- ラインモード(「クック」モードとも呼ばれる)
- ラインモードでは、ラインディシプリンはすべての行編集機能を実行し、「割り込み」および「終了」制御文字を認識してプロセスに送信されるシグナルに変換します。端末から読み取るアプリケーションプログラムは、ユーザーがリターンキーを押して行編集を完了した後、行全体を受け取ります。[2] [7]
- cbreakモード
- cbreakモードは、2つの文字単位モードのうちの1つです。(Stephen R. Bourneは冗談めかして、このモードを「半端に」、つまり「珍しい」モードと呼んでいました(Bourne 1983、p. 288)。ラインディシプリンは行編集を行わず、行編集機能の制御シーケンスは通常の文字入力として扱われます。端末から読み取るアプリケーションプログラムは、入力キューに読み込み可能な文字が現れ次第、直ちに文字を受け取ります。ただし、「割り込み」および「終了」制御文字、そしてモデムフロー制御文字は、依然として特別な処理が行われ、入力ストリームから削除されます。[8] [9]
- 生モード
- rawモードは、2つの文字単位モードのうちのもう1つです。ラインディシプリンは行編集を行わず、行編集機能の制御シーケンスと各種特殊文字(「割り込み」、「終了」、フロー制御)は通常の文字入力として扱われます。端末から文字を読み取るアプリケーションプログラムは、文字を即座に受信し、端末デバイス自体から送信されたのと全く同じ文字ストリーム全体をそのまま受け取ります。[10] [8] [9]
POSIX端末インターフェースでは、これらのモードは、標準入力モードと非標準入力モードの2つの入力モードのみで構成されるシステムに置き換えられました。POSIX端末インターフェースにおけるシグナル生成特殊文字の扱いは入力モードとは独立しており、個別に制御可能です。
制御端末
第 7 版 Unix では、ターミナルジョブ制御はなく、プロセス グループは現在考えられているものとは異なるものと考えられていました。
システム内の各プロセスは、単一の制御端末を持つか、制御端末を全く持たないかのいずれかでした。プロセスは親から制御端末を継承します。制御端末を持たないプロセスが、他のプロセスの制御端末ではない端末デバイスファイルを取得したときに、制御端末が取得されましたopen()。同じ制御端末を持つすべてのプロセスは、単一のプロセスグループに属していました。[11]
アプリケーションプログラミングインターフェース
これらすべてのモードと制御文字を問い合わせ、変更するためのプログラム・インターフェースは、ioctl()システム・コールでした。(これは、第 6 版 Unix のシステム・コールstty()とシステム・コールに代わるものです。) [12] [13] 「消去」文字と「キル」文字は、第 7 版以降長年、開発の惰性により、端末デバイス・ドライバーや多くの Unix システムではデフォルトであらかじめ設定されており、端末デバイスの設定を変更するのはログイン・プロセスの一部、つまりユーザーがユーザー名とパスワードを入力した後に実行されるシステム・ログイン・スクリプトのみでした。ログインおよびパスワードのプロンプトで間違いがあった場合は、テレタイプライター端末から継承された従来の編集キー文字を使用して修正する必要がありました。[4]gtty()#@
値が固定され定義された記号定数とプログラムインターフェースのデータ構造定義はsgtty.hシステムヘッダーで定義されました。[8]
ioctl()操作
操作ioctl()は次のとおりでした。
| シンボル | 3番目の引数が指す構造体 | 説明 |
|---|---|---|
TIOGETP |
sgttyb |
端末パラメータをデータ構造に照会する |
TIOSETP |
sgttyb |
データ構造から端末パラメータを設定し、まず保留中の出力をすべて排出し、キューに入れられた入力をフラッシュする |
TIOSETN |
sgttyb |
待機やドレインなしでデータ構造から端末パラメータを設定する |
TIOCEXCL |
なし | 「専用使用」モードをオンにする |
TIOCNXCL |
なし | 「排他使用」モードをオフにする |
TIOCHPCL |
なし | 「最後の終了時に切断」モードをオンにする |
TIOCFLUSH |
なし | すべての出力キューと入力キューをフラッシュする |
TIOGETC |
tchars |
端末パラメータをデータ構造に照会する |
TIOSETC |
tchars |
データ構造から端末パラメータを設定する |
データsgttyb構造
端末システムコールで使用されるデータ構造の1つはsgttyb構造体であり、そのCプログラミング言語での定義は次の通りである。[14]
struct sgttyb { char sg_ispeed ; // 入力速度char sg_ospeed ; // 出力速度char sg_erase ; // 文字の消去char sg_kill ; // 文字の削除char sg_flags ; // 制御フラグ};
POSIX端末インターフェースとは異なり、第7版Unix端末インターフェースは入力ボーレートと出力ボーレートをデータ構造に直接記録しました。[15]
sg_ispeedおよびフィールドの入出力速度はDEC DH -11の速度であり、0から15の数字で、sg_ospeed記号定数(昇順)で表されます。ボーレートは名前の通りですB0(最後の2つは「外部A」と「外部B」)。ボーレートを0に設定すると、端末ドライバはモデムを切断します(端末がモデムデバイスの場合)。[14]B50B75B110B134B150B200B300B600B1200B1800B2400B4800B9600EXTAEXTB
およびフィールドはsg_erase、sg_killそれぞれ「消去」文字と「削除」文字の文字値であり、それぞれ「#」と「@」の(ASCII)値がデフォルトになっています。[14]
このsg_flagsフィールドでは、次の表に示すように、さまざまな入力および出力制御フラグが指定されます。
| シンボル | 8進数値 | 説明 |
|---|---|---|
BSDELAY |
0100000 | BS文字の 書き込み時の遅延 |
BS0 |
0000000 | |
BS1 |
0100000 | |
VTDELAY |
0040000 | VTおよびFF文字の 書き込み時の遅延 |
FF0 |
0000000 | |
FF1 |
0040000 | |
CRDELAY |
0030000 | CR文字の 書き込み時の遅延 |
CR0 |
0000000 | |
CR1 |
0010000 | |
CR2 |
0020000 | |
CR3 |
0030000 | |
TBDELAY |
0006000 | TAB文字を書き込むときの遅延は、技術的には遅延を指定するものではなく、タブ文字を 1 つ以上のスペース文字のシーケンスに変換します。
XTABS |
TAB0 |
0000000 | |
TAB1 |
00002000 | |
TAB2 |
0004000 | |
XTABS |
0006000 | |
NLDELAY |
0001400 | LF文字の 書き込み時の遅延 |
NL0 |
0000000 | |
NL1 |
00000400 | |
NL2 |
0001000 | |
NL3 |
0001400 | |
EVENP |
0000200 | 偶数パリティ |
ODDP |
0000100 | 奇数パリティ |
RAW |
0000040 | 「生」モード |
CRMOD |
0000020 | キャリッジリターンマッピングモード(入力時にCRはLFにマッピングされ、出力時にCRとLF の両方がCR + LFに変換されます) |
ECHO |
0000010 | 端末ドライバによる ローカルエコーエミュレーション |
LCASE |
0000004 | 入力時に大文字を小文字にマッピングする |
CBREAK |
0000002 | 「cbreak」モード |
TANDEM |
0000001 | モデムフロー制御を有効にする |
データtchars構造
端末システムコールで使用されるデータ構造の1つはtchars構造体であり、そのCプログラミング言語での定義は次の通りである。[16]
struct tchars { char t_intrc ; // 割り込みchar t_quitc ; // 終了char t_startc ; // 開始char t_stopc ; // 停止char t_eofc ; // ファイルの終わりchar t_brkc ; // ブレーク(同じ効果を持つハードワイヤード LF 文字の代替)};
これらのフィールドの値は、プログラムで設定可能な様々な特殊文字の値でした。いずれかのフィールドに-1の値を設定すると、端末ドライバによる認識が無効になります。[16]
参考文献
- ^ ボーン 1983年、8ページ。
- ^ ボーン1983年、130~131ページより。
- ^ ボーン 1983年、287ページより。
- ^ ab Christian 1988、26ページ。
- ^ レフラーら。 1989 年、p. 262.
- ^ ボーン 1983年、132~133ページ。
- ^ レフラーら。 1989 年、p. 259~260。
- ^ abc ボーン 1983年、288ページ。
- ^ ab Leffler et al. 1989, p. 260.
- ^ ボーン 1983年、132ページ。
- ^ ボーン 1983年、130ページ。
- ^ ボーン 1983年、133ページ。
- ^ クリスチャン1988年、393ページ。
- ^ abc ボーン 1983年、286ページ。
- ^ ズロトニック 1991、166ページ。
- ^ ボーン 1983年、289ページより。
参考文献
- ボーン, スティーブン・R. (1983). UNIXシステム. 国際コンピュータサイエンスシリーズ. アディソン・ウェスレー. ISBN 978-0-201-13791-0。
- クリスチャン・カーレ(1988年)『UNIXオペレーティングシステム(第2版)』John Wiley & Sons. ISBN 978-0-471-84781-6。
- レフラー, サミュエル・J.、マクキューシック, マーシャル・カーク、カレルズ, マイケル・J.、クォーターマン, ジョン・S. (1989). 「端末処理」. UNIXオペレーティングシステム4.3BSDの設計と実装. アディソン・ウェスリー社, コンピュータサイエンスシリーズ. アディソン・ウェスリー. ISBN 978-0-201-06196-3。
- ズロトニック、フレッド (1991). 「端末デバイスの制御」. POSIX.1 標準:プログラマーズガイド. ベンジャミン/カミングス出版. ISBN 978-0-8053-9605-8。