web-dev-qa-db-ja.com

BSDスタイルの疑似端末とUNIX98疑似端末

Linuxの疑似端末について読んだ内容に基づくと、疑似端末には2つのタイプがあります。BSDスタイルの疑似端末(非推奨)とUNIX 98疑似端末

これら2種類の疑似端末についての理解を示す2つの画像を作成しました。

次の画像は、BSDスタイルの疑似端末がどのように機能するかを示しています(画像が間違っている場合は修正してください)。

enter image description here

このタイプの疑似端末は理解するのが難しくありません。各端末は一意のマスタードライバーに接続されています。


しかし、UNIX 98疑似端末では、状況はもう少し混乱します。次の画像は、このタイプの疑似端末がどのように機能すると思うかを示しています。

enter image description here

したがって、基本的にすべての端末は同じマスタードライバーを使用します(/dev/ptmx)しかし、マスタードライバーが次の方法をどのように知っているかはわかりません。

  • ターミナルプロセスの1つからデータが送信されている場合、マスタードライバーはどのTTYスレーブドライバーにデータを渡す必要があるかをどのように知るのですか?

  • TTYスレーブドライバーの1つからデータが送信されている場合、マスタードライバーは、データをどの端末プロセスに渡す必要があるかをどのようにして知るのでしょうか。

マスタードライバーは、画像に示した方法でこれを行う方法を知っていますか(つまり、マスタードライバーには、各端末PIDを対応するTTYスレーブドライバーにマップするマッピングテーブルがあります)?

6
user7681202

あなたは不思議なことに名前に魅了されています。 _/dev/ptmx_は「ドライバー」ではなく、ファイルシステム内の単なる名前であり、特別な意味があります。

プロセスは、ファイル記述子を返すposix_openpt()を呼び出すことにより、新しいマスターptyを開きます。 _/dev/ptmx_でopen()を呼び出すことでも同じ効果が得られます。プロセスが_/dev/ptmx_のopen()を呼び出すたびに、new疑似端末が作成されます。このファイル記述子を開いているプロセスがなくなると、疑似端末は破棄されます。このファイル記述子は、疑似端末のマスター側を参照し、他のファイル記述子と同様に子孫プロセスに渡すことができます。

詳細については、 nix.stackexchange.com/questions/117981 を参照してください。 (提案については@JdeBPへのハットチップ。)

プロセスが疑似端末のマスター側を参照するファイル記述子を取得すると、ptsname()を呼び出すことで疑似端末のスレーブ側の名前を見つけることができ、この名前を任意のプロセスに渡すことができます。疑似端末を介した制御。

5
AlexP