追加読書

追加読書

私はLinuxターミナルを私のプログラムにストリーミングしたいと思います。 /dev/ptmxを開いて新しいptsを起動すると、これが実行されることがわかります。これをテストしましたが、うまくいきます(/dev/ptsで動作します)。しかし、実際にこの端末でどのように読み書きできるかはよくわかりません。 /dev/pts/(pts number)への直接書き込み中に入力/出力エラーが発生しました。また、同じプログラムを使用して/dev/ptmxと/dev/pts/(pts番号)の両方を開く必要がありますか?まず、シェルを開く必要がありますか?

これは少し混乱しており、このマニュアルページ以外には多くの情報が見つかりません。http://man7.org/linux/man-pages/man4/pts.4.html

ベストアンサー1

この種のものには2つの異なる部分があります。

  1. 決定したとおり、擬似端末のマスター側を開くと、開くことができるスレーブデバイスファイルが生成されます。ライブラリ機能を使用するptsname()と、マスターはデバイス名を決定するためにファイル記述子として何かを開くことができます。
  2. 同じまたは異なるプログラムが異なるプロセスでスレーブ側を開き、ログインサブシステムが実際の端末と仮想端末を処理するのとまったく同じ方法で処理します。プロセスをセッションリーダーに設定し、スレーブ側をセッションの制御側に設定します。スレーブ側でファイル記述子を開くように標準入力、出力、エラーを設定します。次に、実際にシェルになることができる適切なインタラクティブプログラムをチェーンロードします。

一部のオペレーティングシステムでは、最初の部分がライブラリ関数を呼び出した後にのみ2番目の部分が続くことがありgrantpt()ますunlockpt()。カーネルのインターロックは、マスタでこれらの条件が発生するまでスレーブが開かないようにします。

興味深いことに、これらの機能(AT&T Unix System 5 Release 4)は不要であることが証明されています。スレーブ デバイスが無効なユーザー アカウントと不正な権限で作成される実装が原因で発生します。年齢も多いスレーブ側デバイスは永続文字デバイスノード(権限と所有権は最後の設定で維持されます)であり、即座に作成されないため、他のユーザーが実行している攻撃者プログラムがさまざまな環境で端末にアクセスする機会があります。状況。しかし、今日、一部のオペレーティングシステムカーネルは最初からスレーブデバイスに適切な所有権と権限を提供するため、これらの機能は本質的に機能しなくなります。 FreeBSDとOpenBSDの両方がこのように動作します。残念ながら、カーネル開発者が長年にわたって何度も話しているにもかかわらず、Linuxはそのようなカーネルではありません。

2番目の部分は、これがまったく異なるプロセスであることを意図的にあいまいです。一般的なアーキテクチャはマスタープロセスでfork()、スレーブデバイスを呼び出して開き、ptsname()マスターファイル記述子を閉じます。これは、人々がそのようなツールpty-runを作成するために使用できる一連のnoshツールの機能です。これは、GNU Screen、tmux、XTermなどのGUI端末エミュレータが動作する方法です。ptybandageptyrunscript

しかし、これは必要もの。開こうとしているファイルの名前を知っている限り、スレーブプロセスはfork()マスタープロセスのed子である必要はありません。実際にそうでない場合は、マスター側またはその端末、特に擬似端末に関する知識は必要ありません。

たとえば、私のユーザー空間仮想端末サブシステムで実行されているプロセスは、console-terminal-emulatorスレーブデバイスファイル名を指す既知の固定名を持つシンボリックリンクを生成します。完全に独立したサービスプロセスは、カーネルが毎回使用する正確な名前を知らなくても、既知の固定名を使用してスレーブデバイスを開きます。これらのサービスプロセスは、カーネル仮想端末に接続された同様のサービスプロセスと同じように機能し、実際の端末に接続されたサービスプロセスと本質的に同じです。結局、疑似端末のスレーブ側は、他の2種類の端末のように動作するように設計されています。/dev/pts/N

追加読書

おすすめ記事