- /dev/ptmx は UNIX 98 マスターです。複製デバイス 源泉
- プロセスが/dev/ptmxを開くとファイル記述子PTM(擬似ターミナルマスター)の場合は、/ dev / ptsディレクトリにPTS(擬似ターミナルスレーブ)を作成します。源泉。持つノードなし基本デバイスのファイルシステムで源泉。
- スレーブに書き込まれたデータがマスターに表示されます。記述子入力として。マスターに書き込まれたデータはスレーブに入力として提供されます。源泉。
- Unixおよび関連するコンピュータオペレーティングシステムでは、ファイル記述子(FD、あまり一般的にはfildes)は、ファイルにアクセスするために使用される抽象指定子(ハンドル)です。文書またはその他の入力/出力リソース、パイプやネットワークソケットなど源泉。
結論として:
- /dev/ptmxはマスターレプリケーションのための「モールド」(実際にはファイル記述子)です。
- 擬似端末は、双方向通信を提供する一対の仮想デバイスである。チャンネルの一端はファイル記述子(マスター)もう一つは/dev/pts/nです。装備(奴隷)。
- PTMデバイスはなく、ファイル記述子のみがあります。
- ファイル記述子はアクセスに使用されます。文書またはリソース。
質問:
- ファイル記述子が処理するPTMリソースはどこにありますか?
- PTMマスターを「デバイス」と呼ぶのはなぜですか? /devにエントリがないためです。
- 一つできますか?修正済みSSHDなどのプログラムは、中間PTMなしでPTSと直接通信できますか?
答え1
疑似端末がどのように機能するかを理解するには、これを実際の物理端末の抽象化と考える必要があります。今日、最も一般的な物理端末はLinux仮想コンソールですが、当時は実際の物理端末が非常に一般的で、日常業務でユーザーが見ることができるコンピュータシステムの唯一の部分でした。
実際の物理端末には2つの異なる側面(必要に応じて「側面」)があります。
ユーザーが座る「外部」。これには、ユーザーが文字を入力できるキーボードと、コンピュータの出力を表示できる画面があります。擬似端末の抽象化では、これは「主な」終わりです。
オペレーティングシステムで文字デバイスとして表示される「内部」側面。擬似端末の抽象化では、これは「スレーブ」側です。
プログラムがユーザーと通信するために使用する物理端末の「外部」側面と「内部」文字デバイスの間には、一連の処理セットがあり、端末ハードウェア自体は画面を更新し、オペレーティングシステムはユーザーキーストロークをバッファリングできます。ライン編集などを行います。
Digital Equipment Corporation VT220ターミナル。あなたはその「フロント」を見ています。擬似端末の場合、これは「基本」側として表示されます。 Wikimediaの画像。
ファイル記述子が処理するPTMリソースはどこにありますか?
カーネルメモリにあります。プロセスが開かれると、
/dev/ptmx
カーネルはマスターとスレーブからなる新しい擬似端末を生成します。マスター側はそれを作成したプロセスに属します/dev
。スレーブ側は、端末と通信したいすべてのプロセスによって開くことができるので/dev
。PTMマスターを「デバイス」と呼ぶのはなぜですか? /devにエントリがないためです。
私たちは通常それをデバイスと呼びません。私たちは通常これを擬似端末の基本的な側面と呼びます。しかし、そうです。通常のファイルではなく、文字デバイスに近いです。たとえば、これを保持しているプロセスは以前の場所を検索できません。新しいバイトを読み込むか、新しいバイトを書き込むことができます。
SSHDなどの修正プログラムは、中間PTMなしでPTSと直接通信できますか?
sshd は擬似端末のスレーブ側と通信しません。 sshdは擬似端末のマスター側を保持し、スレーブ側はSshdによって生成されたプロセス(シェルなど)によって使用されます。
sshdは次のように動作します。
ネットワーク経由でログイン要求が行われ、ユーザーが認証されると、Sshdはマスターを保持し、擬似端末からの要求に応じてプロセス(通常はシェル)を生成します。標準入力、標準出力、標準エラーによるスレーブ。
ネットワークから受信した文字は、Sshdによって擬似端末のマスター側に書き込まれます。これはユーザーがキーボードで入力することをシミュレートします。カーネルはこの文字ストリームを処理します(または処理しません)。擬似端末スレーブ(シェルなど)を持つプロセスは、実際の端末と通信しているかのようにそれを受け取ります。
マスターデバイスとスレーブデバイスの間にはオペレーティングシステムのカーネルがあり、スレーブデバイスの状態に応じて特定の処理を実行したり、特定の処理を実行したりしない場合があります。バラよりライン規律、そしてマニュアルページ
stty
(1) そしてioctl
(2)(特に端子または擬似端子のスレーブ側に適用されます。)。
_______ ______ ______ ______ _____ ______
( ) bytes in | | | | | | | | | Bash |
(Network)---------->| Sshd |---->|Master|---->| OS |---->|Slave|---->| Vi |
( )<----------| |<----| PTY |<----|kernel|<----| PTY |<----| Less |
(_______) bytes out |______| |______| |______| |_____| |______|
_______ _____ ______ ______ _____ _____ _______
< > Events | | | | | | | | | | ( )
< GUI >-------->|Xterm|--->|Master|--->| OS |--->|Slave|--->| Ssh |--->(Network)
< ><--------| |<---| PTY |<---|kernel|<---| PTY |<---| |<---( )
<_______> Drawing |_____| |______| |______| |_____| |_____| (_______)
答え2
このoracleリンクの一番上に移動すると、「序文」を見つけることができます。
STREAMSプログラミングガイドでは、STREAMSを使用してアプリケーションを設計および実装する方法、およびSTREAMSモジュールおよびドライバを使用して、次の要件を満たすアーキテクチャを実装する方法について説明します。SolarisTM 7DDI/DDK。
Solaris7は1998年から2010年までです。このoracle / solarisリンクは、まだよく説明されているCコードの設定を説明します。
fdm = open("/dev/ptmx", O_RDWR); /* open master */
grantpt(fdm); /* change permission of slave */
unlockpt(fdm); /* unlock slave */
slavename = ptsname(fdm); /* get name of slave */
fds = open(slavename, O_RDWR); /* open slave */
char devがオンになっている次の2行を分離します。
fdm = open("/dev/ptmx", O_RDWR); /* open master */
fds = open( slavename, O_RDWR); /* open slave */
対称性が見えます。唯一の違いは次のとおりです。
- 周波数分割多重の目的
string "/dev/ptmx"
- fdsには
variable slavename
次の文字列が含まれています...?(ボーナスQ))
もちろん、リンクはここで行われます:slavename = ptsname(fdm)
。一般英語:マスターデバイスを開き、返されたfdに属するスレーブデバイスの名前を返します。誰もそうは言わなかった細かい。
それともタイプミスですか?いいえ!マスターが保持しているチケット(fdmなど)に割り当てられた番号/名前(/dev/pts/8、/dev/pts/17、...)を確認するには、ptsname()を見つける必要があります。 「)」)。
そしてman ptsname
:
これ点号()関数はスレーブ擬似端末装置の名前を返します。ドン所有者へ話すFDで。
ファイル記述子 "fd_" を取得するために擬似デバイスが 2 回開かれますが、初めて fdm "only" が fds を取得します。次に fds を使用して新しいスレーブデバイスを読み書きします。
ご宿泊のお客様は、まず共用の客室でプライベートルームの鍵をお受け取りください。
real physical VT
しかし、サウンドサポートカラーターミナルの最初の発明者の明確な絵がなかったならば、私はこれらすべてを決して気付かなかったでしょう。