歴史セクション、退屈なら飛ばしてください

歴史セクション、退屈なら飛ばしてください

Linux では、ターミナルはシェルに関連付けられています。ターミナルはシェルに入力を送信し (例: pwd)、シェルは出力をターミナルに返します (例: /home/paul)。

この図は、ターミナルとシェルの関係を示しています (使用しているターミナルはgnome-terminal、シェルは であると仮定しますbash)。

ここに画像の説明を入力してください

ここで私が知りたいのは、ターミナルとシェルがデータを交換するためにどのようなメカニズムを使用するかということです。次のようなことが起こると考えられます。

  • を実行するとgnome-terminal、ディレクトリ内にシリアル ポートを表すファイルが作成されます/dev/pts(ファイル名は とします/dev/pts/0)。
  • gnome-terminal次に、関連付けられているシェル (例: bash) を実行し、pts ファイル名を渡します (pts ファイル名は、たとえばコマンドライン引数を通じて渡すことができます)。
  • これでgnome-terminal、 と の両方がbashから読み取りを開始します/dev/pts/0
  • gnome-terminalが にデータを送信する場合bash、 はこのデータを に書き込み/dev/pts/0bashからこのデータを読み取ります/dev/pts/0
  • bashにデータを送信する場合gnome-terminal、 はこのデータを に書き込み/dev/pts/0and gnome-terminalはこのデータを から読み取ります/dev/pts/0

この図は、私が今説明した内容を示しています。

ここに画像の説明を入力してください

私の理解は正しいでしょうか?


注記: もちろん、仮想端末を使用している場合 (つまり、GUI を使用していないとき) は、pts ファイルは tty ファイルになることがあります。ただし、ロジックは同じです。

答え1

必要な部分が欠けています。疑似 tty デバイスはソケットのように対称ではありません。マスター側とスレーブ側があります。 のファイルは/dev/ptsスレーブ デバイスを表します。

端末エミュレーターは、 を呼び出すことによって疑似 tty を作成しますopenpty(または、新しい tty で新しいプロセスを実行する一般的なケースのためのボーナス セットアップを追加しforkptyます)。低レベルでは、これにはいくつかのマジック ioctl をopenpty開いて実行することが含まれます。/dev/ptmx

ターミナル エミュレーターを呼び出すと、openptyファイル記述子のペアが取得され、スレーブに対応するファイル名も取得できます/dev/pts。子プロセスが名前でファイルを開く必要がないため、マスターは個別の名前を取得しません。

マスター デバイスとスレーブ デバイスは、ソケットの反対側のような動作をします。つまり、一方の端に書き込んだ内容がもう一方の端から読み取られます。ただし、これは tty であるため、通過するデータにはすべての tty モードが適用されます。

たとえば、端末エミュレーターでキーの押下を受け取った場合は、マスター ファイル記述子にA書き込む必要があります。これは、端末からコンピューターにシリアル ラインを介してそのバイトを送信することとまったく同じです。その結果、スレーブから読み取られます (読み取りを行うプログラム (シェルなど) によって)。'a''a'

キーが押されているD間にキーの押下を受け取った場合は、マスター ファイル記述子に 1バイト ( ) を書き込む必要があります (実際の端末がワイヤに送信するのはこれであるため)。次に何が起こるかは、tty モードによって異なります。raw モードでは、スレーブ tty を読み取るプログラムは 1 バイトを参照します。cooked モードでは、tty は「EOF 特殊キーが押された」動作をアクティブにします。Ctrl4'D' ^ 0x404

逆方向にも、何らかの処理があります。何らかのプログラムが'\n'スレーブ tty に書き込むと、後処理"\r\n"のため、マスター ファイル記述子で受信される可能性があります。onlcr

歴史セクション、退屈なら飛ばしてください

昔、スレーブ デバイスの名前は で/dev/ttyp0、それぞれに対応するマスター ( ) がありました/dev/ptyp0。これらは動的に作成されませんでした。端末エミュレーターは、それらすべてを調べて、現在使用されていないものを探し、それを使い始めるだけでした。所有権と権限の管理が問題でした。は、xtermスレーブを chown できるように setuid-root でした。

「UNIX98 ptys」と呼ばれる新しいスキームは、マジック ioctl を通じてデバイスの作成と所有権を処理するため、ファイルは/dev/pts使用中の場合にのみ表示され、ファイルを作成したプログラムを実行したユーザーが所有します。

関連情報