
Linux の疑似端末について私が読んだところによると、疑似端末には次の 2 種類があります。BSDスタイルの擬似端末(非推奨)およびUNIX 98 擬似端末。
私は、これら 2 種類の疑似端末についての理解を示す 2 つの画像を作成しました。
次の図は、BSD スタイルの疑似端末がどのように動作するかを示しています (図が間違っている場合は訂正してください)。
このタイプの疑似端末は理解するのが難しくなく、各端末は固有のマスター ドライバーに接続されます。
しかし、UNIX 98 疑似端末では、状況は少し複雑です。次の図は、このタイプの疑似端末がどのように動作するかを示しています。
したがって、基本的にすべての端末は同じマスター ドライバー ( /dev/ptmx
) を使用しますが、マスター ドライバーが次の操作をどのように行うかはわかりません。
データが端末プロセスの 1 つから送信されている場合、マスター ドライバーはデータをどの TTY スレーブ ドライバーに渡す必要があるかをどのように認識するのでしょうか。
データが TTY スレーブ ドライバーの 1 つから送信されている場合、マスター ドライバーはデータをどの端末プロセスに渡す必要があるかをどのように認識するのでしょうか。
マスター ドライバーは、画像に示した方法でこれを行う方法を知っていますか (つまり、マスター ドライバーには、各端末 PID を対応する TTY スレーブ ドライバーにマッピングするマッピング テーブルがあります)?
答え1
あなたは名前に好奇心をそそられます。/dev/ptmx
は「ドライバー」ではなく、特別な意味を持つファイルシステム内の名前にすぎません。
プロセスは を呼び出して新しいマスターptyを開き、ファイル記述子を返します。を呼び出すposix_openpt()
ことで同じ効果が得られます。プロセスが を呼び出すたびに、open()
/dev/ptmx
open()
/dev/ptmx
新しい疑似端末が作成されます。このファイル記述子を開いているプロセスがなくなると、疑似端末は破棄されます。このファイル記述子は疑似端末のマスター側を参照し、他のファイル記述子と同様に子孫プロセスに渡すことができます。
詳しい情報についてはunix.stackexchange.com/questions/117981(この提案をしてくれた@JdeBPに感謝します。)
プロセスが擬似端末のマスター側を参照するファイル記述子を取得すると、 を呼び出して擬似端末のスレーブ側の名前を調べptsname()
、擬似端末を介して制御する任意のプロセスにこの名前を渡すことができます。