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
からこのデータを読み取ります。 。この図は、私が今説明したことを示しています。
私の理解は正しいですか?
注:もちろん、ptsファイルはttyファイルである可能性があります仮想端末を使用していましたが(つまり、GUIを使用していない場合)、ロジックは同じです。
あなたは必要な部分を逃しています。疑似ttyデバイスはソケットのように対称的ではありません。マスターエンドとスレーブエンドがあります。 /dev/pts
内のファイルは、スレーブデバイスを表します。
ターミナルエミュレータは、openpty
(またはforkpty
であるopenpty
に加えて、新しいプロセスを実行する一般的なケースのためのボーナスセットアップを呼び出すことによって疑似ttyを作成します。新しいtty)。下位レベルでは、これには/dev/ptmx
を開き、いくつかの魔法のioctlを実行することが含まれます。
openpty
を呼び出した結果、ターミナルエミュレータはファイル記述子のペアを取得し、スレーブに対応する/dev/pts
内のファイルの名前を取得することもできます。子プロセスが名前でマスターを開く必要がないため、マスターは個別の名前を取得しません。
マスターデバイスとスレーブデバイスは、ソケットの両端のように機能します。一方の端に書き込んだ内容は、もう一方の端から読み取られます。ただし、これはttyであるため、すべてのttyモードが途中でデータに適用されます。
たとえば、ターミナルエミュレータで、のキー押下を受け取った場合 A キー、マスターファイル記述子に'a'
を書き込む必要があります。これは、そのバイトを端末からコンピュータにシリアル回線で送信することと直接同じです。その結果、'a'
がスレーブから読み取られます(シェルなど、それを読み取っているプログラムによって)。
キーが押された場合 D キーを押しながら Ctrl キーが押されている場合は、マスターファイル記述子に4
バイト('D' ^ 0x40
)を書き込む必要があります。 (これは、実際の端末がネットワーク上で送信するものだからです。)次に何が起こるかは、ttyモードによって異なります。 rawモードでは、スレーブttyを読み取るプログラムに4
バイトが表示されます。クックモードでは、ttyは「EOF特殊キーが押されました」動作をアクティブにします。
逆方向には、いくつかの処理もあります。一部のプログラムがスレーブttyに'\n'
を書き込むと、onlcr
の後処理のために、マスターファイル記述子で"\r\n"
を受け取る可能性があります。
はるか昔、スレーブデバイスには/dev/ttyp0
のような名前があり、各デバイスには/dev/ptyp0
のような対応するマスターがありました。それらは動的に作成されませんでした。ターミナルエミュレータは、それらすべてをプローブして、現在使用されていないものを見つけ、使用を開始することができます。所有権と権限の管理が問題でした。 xterm
は、スレーブをchownできるようにするためにsetuid-rootでした。
「UNIX98ptys」と呼ばれる新しいスキームは、魔法のioctlを介してデバイスの作成と所有権を処理するため、ファイルは使用中は/dev/pts
にのみ表示され、作成したプログラムを実行したユーザーが所有します。それら。