私が知っている限り、/dev/pts
ファイルはsshまたはtelnetセッション用に生成されます。
答え1
には何も保存されていません/dev/pts
。ファイルシステムは純粋にメモリにのみ存在します。
項目は次のとおり/dev/pts
です。擬似端末(ptyと呼ばれる)。 Unixカーネルには共通の概念があります端末。端末は、アプリケーションが端末を介して出力を表示し、入力を受け取る方法を提供します。端末機器。プロセスには次のものがあります。制御端子- テキストモードアプリケーションの場合、これがユーザーと対話する方法です。
端末は、ハードウェア端末(「tty」、「teletype」の略語)、または擬似端末(「pty」)のいずれかです。ハードウェア端末は、シリアルポート(ttyS0
、…)、USB(ttyUSB0
、…)、PC画面、キーボード(、…)などの特定のインターフェースを介して接続されますtty1
。擬似端末は、アプリケーションである端末エミュレータによって提供されます。擬似端末のいくつかのタイプは次のとおりです。
- GUIアプリケーション(xterm、gnome-terminal、konsoleなど)は、キーボードイベントとマウスイベントをテキスト入力に変換し、出力を特定のフォントでグラフィカルに表示します。
- マルチプレクサアプリケーション(screenやtmuxなど)は、他の端末の入力と出力を中継して、実際の端末からテキストモードのアプリケーションを分離します。
- リモートシェルアプリケーション(sshd、telnetd、rlogindなど)は、クライアントのリモート端末とサーバーのptyの間で入出力を中継します。
プログラムが書き込み用に端末を開くと、プログラムの出力が端末に表示されます。複数のプログラムが同時にターミナルに出力することは一般的ですが、出力のどの部分がどのプログラムから出るのかを区別することは不可能であるため、時には混乱することがあります。制御端末に書き込もうとするバックグラウンドプロセスSIGTTOU信号によって自動的に一時停止。
プログラムが読み取り用に端末を開くと、ユーザーの入力がプログラムに渡されます。複数のプログラムが同じ端末から読み出される場合、各文字はプログラムの一つに独立してルーティングされる。これはお勧めできません。通常、特定の時間に1つのプログラムだけが積極的に端末からデータを読み取る。プログラムは、制御端末にないときに制御端末からデータを読み取ろうとします。展望はいSIGTTIN信号によって自動的に一時停止。
実験するには、tty
端末で実行して端末デバイスが何であるかを確認してください。/dev/pts/42
他の端末のシェルで次を実行しますecho hello >/dev/pts/42
。文字列がhello
別の端末に表示されます。cat /dev/pts/42
別の端末を実行して入力してください。コマンドを終了するにはcat
(他の端末を使いにくくすることができます)Ctrl+を押しますC。
たとえば、他の端末に書き込むことが通知を表示するのに役立ちます。write
コマンドはまさにそのことをします。データは通常、他の端末から読み取られません。
答え2
ファイルは/dev/pts
「pseudo-ttys」です。名前付きパイプとやや似ていますが、VT-100などの古いシリアル接続端子を模倣することもあります。 pseudo-tty はキーボードからプログラムへ、プログラムから出力デバイスへバイトを転送する役割を果たします。これは簡単に見えます。しかし、これはあなたの明示的な質問に対する答えです。/dev/pts/0
たとえば、カーネルは何も保存しません。 pseudo-tty に接続されたプログラムの stdout からバイトストリームのみが入ってきて、そのバイトは stdin が同じ pseudo-tty に接続されたプログラムから読み込まれます。
また、pseudo-tty はこれらのバイトストリームに間接層を配置します。カーネルは、「Control-C」、「Control-D」、または「Control-U」(設定可能、参考資料を参照man stty
)などの特殊値のバイトを確認し、SIGINTを送信し、stdinでファイルを設定または消去できます。入力ライン。そこにバッファリング機能もあり、私の「何も保存しない」がちょっと間違っていますが、数キロバイトしかありません。
カーネルは出力のバイト値を調べ、"\n"
改行文字(ASCII改行、LF、または)を2バイトに変換したり、キャリッジリターンと改行文字(CRLFまたは"\r\n"
)またはシリアル文字に必要なすべての操作を実行できます。端末ハードウェアバイト操作。疑似端末を間接的に使用すると、ハードウェアから独立することができます。
pseudo-ttyはまた、すべての「転送速度設定」、「パリティ設定」ioctl()
などのシステムコールを許可し、これに対して何もしない可能性があります。これにより、VT-100、ADM-3、およびWyse時代に作成されたプログラムがエラーなしで実行を継続できます。ソフトウェア(擬似ttysデバイスドライバ)はハードウェアのように動作します。
擬似ttyはsshd
およびで使用できますが、ターミナルエミュレータ(または)と通常はxterm内で実行されているシェルの間でもtelnet
使用できます。xterm
rxvt
Linuxと多くのUnixには疑似ttyがあります。プラン9ではそうではありません。同様のttyは、シリアルケーブルで接続されたハードウェア端末時代のアーティファクトであるややアーティファクトです。
答え3
/dev/
デバイスファイル用の特別なディレクトリです。これは抽象化であり、ディスク上の物理ファイルではありません。このディレクトリは起動時に入力され、カーネルとユーザースペースデーモンによって作成および削除される既存のデバイスインターフェイスを反映するように変更できますudevd
。
このように表現された多くのデバイスは仮想です。これには、/dev/pts
コンソールデバイスである項目が含まれます。これがリモートセッション用のセッションが作成される理由です。ローカル GUI 端末を開くときにも生成されます。
あまり使用されていませんが、ファイルで開くことができます。/dev/pts
シェルが接続されているノードを取得するには、次のようにしますtty
。
> tty
/dev/pts/4
それでは別のコンソールに切り替えて、次のことを試してみてください。
> echo "duck!" > /dev/pts/4
賢い。今試してください:
> cat /dev/pts/4
それから/dev/pts/4でシェルを試してみてください。cat
反対側に出るまでしっかり止められますが、pts / 4に入力したほとんどの内容はそのまま渡されます(例: "hello world"を試してみてください。最終的にhl
pts / 4とコンソールello word
の両方に入力しましたcat
)。
私の考えでは、デバイスがシェルから入力を受け取り、システムを介して出力し、これがコンテンツが画面に表示される方法です。シェルはハードウェアではなくシステムを処理します。試してみてください(何かわからない場合はstrace bash
見てください)。man strace
bashが起動すると、一連の呼び出しを受け取ります。ここでキーを入力してみてください。
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
入力された文字ごとに標準入力から読み取られ、標準出力に書き込まれます。しかし、シェルの標準出力は何に接続されていますか?それでは、strace
GUI端末でこれを試してみてください。名前がわからない場合は、それが何であるかを調べる必要があります。たとえば、KDEでは、konsole
私はそれがGNOMEにあると信じていますgnome-terminal
。出力はおそらくもっと秘密になります。strace
私の結果は多くのpoll()
合計を持っています。recvfrom()
何も書かれていませんが、今cat
他の端末からトリックを取得すると、catが入力中に読み取ったキーストロークがstrace出力にまったく応答しないことがわかります。端末はこれを受信しません。 。したがって、GUIターミナルアプリケーションとcatは、シェルが出力するのと同じデバイスで読み取るために競合します。