web-dev-qa-db-ja.com

ターミナルとシェルはどのようにデータを交換しますか?

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

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

enter image description here

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

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

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

enter image description here

私の理解は正しいですか?


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

5
user7681202

あなたは必要な部分を逃しています。疑似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にのみ表示され、作成したプログラムを実行したユーザーが所有します。それら。

6
user41515