
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/0
、bash
からこのデータを読み取ります/dev/pts/0
。bash
にデータを送信する場合gnome-terminal
、 はこのデータを に書き込み/dev/pts/0
、and
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' ^ 0x40
4
逆方向にも、何らかの処理があります。何らかのプログラムが'\n'
スレーブ tty に書き込むと、後処理"\r\n"
のため、マスター ファイル記述子で受信される可能性があります。onlcr
歴史セクション、退屈なら飛ばしてください
昔、スレーブ デバイスの名前は で/dev/ttyp0
、それぞれに対応するマスター ( ) がありました/dev/ptyp0
。これらは動的に作成されませんでした。端末エミュレーターは、それらすべてを調べて、現在使用されていないものを探し、それを使い始めるだけでした。所有権と権限の管理が問題でした。は、xterm
スレーブを chown できるように setuid-root でした。
「UNIX98 ptys」と呼ばれる新しいスキームは、マジック ioctl を通じてデバイスの作成と所有権を処理するため、ファイルは/dev/pts
使用中の場合にのみ表示され、ファイルを作成したプログラムを実行したユーザーが所有します。