第7版Unixの端末インターフェースは、第7版Unixで従来利用可能だった端末を、プログラム用のアプリケーションプログラミングインターフェースとユーザーに対する一連の動作要件の両方を含むように抽象化した汎用的なものです。これは現在ではPOSIX端末インターフェースにほぼ取って代わられています。
Seventh Edition Unix およびUNIX/32Vで提供され、BSDバージョン 4では旧ターミナル ドライバとして提供されていたターミナル インターフェースは、主にテレタイプ ライターを端末として使用することを想定したシンプルなものでした。入力は 1 行ずつ行われ、オペレーティングシステム内のターミナル ドライバ (端末自体ではなく) が簡単な行編集機能を提供していました。編集が行われるバッファはカーネルによって管理されていました。端末入力を読み取るアプリケーションは、return行編集を終了するために端末でキーが押されたときにのみバッファの内容を受け取ります。端末からシステムに送信されるキーは、編集バッファの現在の内容全体を消去 (「終了」) し、通常は「」記号の後に改行シーケンスが続く形で表示され、印刷位置を新しい空白行に移動させました。端末からシステムに送信されるキーは、編集バッファの末尾の最後の文字を消去し、通常は「」記号として表示されます。ユーザーは、これが前の文字の「消去」を意味することを認識する必要がありました(テレタイプライターは、紙に印刷された文字を物理的に消去することができないためです)。[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]@@##
プログラミングの観点から見ると、端末デバイスには、送信および受信ボーレート、「消去」および「終了」文字(前述のように行編集を実行)、「割り込み」および「終了」文字(端末が制御端末となっているすべてのプロセスにシグナルを生成)、「開始」および「停止」文字(ソフトウェアフロー制御に使用)、「ファイルの終わり」文字(キャリッジリターンのように動作するが、システムコールによってバッファから破棄されるため、長さゼロの結果が返される可能性がある)、およびカーネルの端末ドライバによってローカルエコーがエミュレートされるかどうか、モデムフロー制御が有効になっているかどうか、さまざまな出力遅延の長さ、キャリッジリターン文字のマッピング、および 3 つの入力モードを決定するさまざまなモードフラグがありました。[ 6 ]read()
第7版Unixにおける端末の入力モードは以下の3つでした。
POSIX端末インターフェースでは、これらのモードは、正規入力モードと非正規入力モードの2つの入力モードのみからなるシステムに置き換えられました。POSIX端末インターフェースにおける信号生成特殊文字の処理は、入力モードとは独立しており、個別に制御可能です。
Unix第7版では、端末ジョブ制御は存在せず、プロセスグループも現在のような概念とは考えられていませんでした。
システム内の各プロセスは、単一の制御端末を持つか、制御端末を全く持たないかのいずれかでした。プロセスは親から制御端末を継承します。制御端末は、制御端末を持たないプロセスが、open()他のプロセスの制御端末として既に使用されていない端末デバイスファイルを取得したときに取得されました。同じ制御端末を持つすべてのプロセスは、単一のプロセスグループに属していました。[ 11 ]
これらのモードと制御文字すべてを照会および変更するためのプログラムインターフェースは、ioctl()システムコールでした。(これは、第 6 版 Unix のstty()およびシステムコールに取って代わりました。) [ 12 ] [ 13 ] 「消去」文字と「終了」文字は、デフォルトの および から変更可能でしたが、第 7 版の開発の慣性により、長年にわたり、端末デバイスドライバのプリセットのデフォルト値であり、ログインプロセスの一部としてのみ端末デバイス設定を変更する多くの Unix システムでは、ユーザーがユーザー名とパスワードを入力した後で実行されるシステムログインスクリプトで、ログインとパスワードのプロンプトでの誤りは、テレタイプライター端末から継承された従来の編集キー文字を使用して修正する必要がありました。[ 4 ]gtty()#@
値が固定され定義されていた記号定数と、プログラムインターフェースのデータ構造sgtty.h定義は、システムヘッダーで定義されていた。[ 8 ]
ioctl()業務作戦ioctl()内容は以下のとおりです。
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-11sg_ospeedのもので、 は 0 から 15 までの数値で、記号定数 (昇順) 、、、、、、、 、 、、、 、、、で表され、ボーレートは名前のとおり (最後の 2 つは「外部 A」と「外部 B」) でした。ボーレートをゼロに設定すると、端末ドライバは (端末がモデム デバイスの場合) モデムを強制的に切断しました。[ 14 ]B0B50B75B110B134B150B200B300B600B1200B1800B2400B4800B9600EXTAEXTB
とフィールドはsg_erase、sg_killそれぞれ「erase」文字と「kill」文字の文字値であり、それぞれ「#」と「@」の (ASCII) 値がデフォルト値として設定されていました。[ 14 ]
このsg_flagsフィールドでは、次の表に示すように、さまざまな入出力制御フラグを指定しました。
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 ]