Linuxプログラミングインターフェースから
擬似端末の核心はスレーブデバイスは標準端子のように見えます。。端末デバイスに適用できるすべてのタスクは、疑似端末スレーブデバイスにも適用できます。これらの操作の一部は疑似端末には適していませんが(端末回線速度やパリティ設定など)、疑似端末はその操作を自動的に無視するため、問題ありません。
ターミナル指向プログラムの場合、スレーブデバイスは標準ターミナルのように動作します。また、ターミナルプログラムのプロセスを制御するターミナルと同じです。
マスターデバイスは標準端末のようにドライバに表示されますか?それでは、制御端末のように?それ以外の場合は、デバイスファイルまたは一般ファイルと似ていますが、必ずしも端末用のデバイスファイルである必要はありませんか?
ありがとうございます。
答え1
マスターデバイスは、tcgetattr()
//&cを介してtcsetattr()
アクセスできる行ルールを持つ端末デバイスファイルのように見えます。そして成功isatty()
。実はそうです同じライン制御インスタンスはスレーブとして機能します。これは、マスター側プログラムがウィンドウサイズの変更などの情報をスレーブ側プログラムに送信する方法です。これはまた、メインサイドプログラムが回線速度をゼロに設定して回線規律の切断メカニズムをトリガすることによって(シミュレートされた)モデムの切断を通知する方法でもあります。 (したがって、本文の線形速度の説明は正しくありません。はい回線速度が適切な状況。 )
違いは読み取り/書き込みI / Oです。読み込まれるのは、実際の端末の場合、実際の基本シリアルデバイスを介して送信される一連の文字です。物理端末の場合、記録される内容は実際の基本シリアル装置が受信した文字列です。つまり、反対側ライン分野別標準/非標準入出力処理。
これにはいくつかの複雑さがあります。パケットモードそしてリモートモード。後者は長い間使用されておらず、今世紀初頭にほとんどのオペレーティングシステムには存在しなかったため、Daniel J. Bernsteinの以前のptyツールへのパッチが必要でした。前者はほとんどの作業に特に便利ではないので、この回答ではこれについて詳しく説明しません。
主な装置は通常いいえマスタープロセスが実行されるセッションの制御端末。概念的には、これは次のようになります。内部構造実際の端末が間違った場所にあります。そのセッションの制御端末は次のとおりです(存在する場合)。その他端末。
script
:terminal
これは、他の端末デバイスに直接レンダリングされ、その端末デバイスが制御する対話型セッションで実行されるNeoVIM、emacs、およびptybandage
(パイプラインの一部ではない場合)などのプログラムの場合です。
SSHサーバー、GUI端末エミュレータ、console-terminal-emulator
noshツールセットptyrun
(通常使用される場合)またはzhconなどのモノリシックフレームバッファ端末エミュレータから。これは、ファイルシステムのバッファとFIFO(console-terminal-emulator
TCPソケットを介して)からフレームバッファやHIDに似たデバイスまで、さまざまなI / Oデバイスにレンダリングされ、それらのいずれも端末ではありません。さらに、console-terminal-emulator
SSHサーバーとフレームバッファー端末エミュレータは通常デーモンプロセスのコンテキストで呼び出され、もちろん制御端末なしでセッションが開始されます。
このグラフは決定的ではありません。マスタープロセスが必ずしもスレーブプロセスを生成するわけではありません。たとえば、nosh-toolset ユーザ空間仮想端末では、スレーブプロセスはttylogin@*
サービスマネージャによって分岐される汎用サービスであり、マスターのエミュレータプロセスとマスターのログインセッションプロセスとの間に直接的なプロセス関係はありません。奴隷側。ただし、これはこの回答の範囲外です。
追加読書
- https://unix.stackexchange.com/a/177209/5132
- https://unix.stackexchange.com/a/249801/5132
- ジョナサンデボインポラード(2018)。「ユーザー空間仮想端末」。 スナックガイド。 1.38。何かを食べる。 JdeBPソフトウェア。
- ジョナサンデボインポラード(2018)。ユーザー空間仮想端末のツアー 何かを食べる。 JdeBPソフトウェア。
答え2
主なデバイスはほとんどパイプのように見えます。パイプのようにファイル記述子を読み書きすることができ、サイズが適しています。短い読み取り内容が得られるので、 read(2) が返す内容を確認してください。