回答:
には何も保存されません/dev/pts
。このファイルシステムは純粋にメモリ内に存在します。
のエントリ/dev/pts
は擬似端末です(略してpty)。Unixカーネルには、端末の一般的な概念があります。端末は、アプリケーションが出力を表示し、端末デバイスを介して入力を受信する方法を提供します。プロセスには制御端末があります。テキストモードアプリケーションの場合、これはユーザーとの対話方法です。
端末は、ハードウェア端末(「tty」、「teletype」の略)または擬似端末(「pty」)のいずれかです。ハードウェア端末は、シリアルポート(ttyS0
、…)やUSB(ttyUSB0
、...)などのインターフェースを介して、またはPC画面とキーボード(tty1
、...)を介して接続されます。疑似端末は、アプリケーションである端末エミュレーターによって提供されます。疑似端末のいくつかのタイプは次のとおりです。
プログラムが書き込みのために端末を開くと、そのプログラムからの出力が端末に表示されます。複数のプログラムが同時に端末に出力することはよくありますが、出力のどの部分がどのプログラムから来たのかを知る方法がないため、混乱を招く場合があります。それらの制御端末に書き込もうとするバックグラウンドプロセスはSIGTTOU信号によって自動的に中断されるかもしれません。
プログラムが読み取りのために端末を開くと、ユーザーからの入力がそのプログラムに渡されます。複数のプログラムが同じ端末から読み込んでいる場合、各文字はプログラムの1つに独立してルーティングされます。これは推奨されません。通常、特定の時間に端末からアクティブに読み取るプログラムは1つだけです。彼らはしていない間、その制御端末から読み取ろうとするプログラムの前景がされ、自動的にSIGTTIN信号によって中断します。
実験するにtty
は、ターミナルで実行して、ターミナルデバイスを確認します。と言いましょう/dev/pts/42
。別の端末のシェルで、次を実行しますecho hello >/dev/pts/42
。文字列hello
は他の端末に表示されます。次にcat /dev/pts/42
、他のターミナルを実行して入力します。そのcat
コマンドを終了するには(他の端末を使いにくくします)、Ctrl+を押しCます。
別の端末への書き込みは、通知を表示するのに役立つ場合があります。たとえば、write
コマンドはそれを行います。通常、別の端末からの読み取りは行われません。
strace
プログラムは入力を読み取ることができますが、それだけです。
tostop
は、ttyフラグが設定されている場合にのみSIGTTOUを取得します。このフラグはデフォルトでは設定されていません。そして、私は別のTTYからの読み取りを修正しました。私はそれを試してみましたが、動作しますが、文字ごとではなく、読み取りごとです(シェルプロンプトに座っているときは、シェルが一度に1文字を読むのと同じです)。これが私があなたの答えを解釈した方法であるので、この点を明確にすることは良いかもしれません。
read
呼び出しは連続した文字(または、むしろバイト)のみを返しますが、アプリケーションはread
呼び出しが返すバイト数を制御できないため、それ以上はありません。
のファイル/dev/pts
は「pseudo-ttys」です。ある程度名前付きパイプに似ていますが、VT-100のような古いシリアル接続端末も模倣します。疑似ttyは、キーボードからプログラムへ、およびプログラムから出力デバイスへバイトを転送する作業を行います。これは簡単に聞こえます。しかし、これは明示的な質問に答えます/dev/pts/0
。たとえば、カーネルには何も保存されません。疑似ttyに接続されているプログラムのstdoutからのバイトストリームのみが入り、stdinが同じ疑似ttyに接続されているプログラムがそれらのバイトを読み取ります。
また、疑似ttyは、これらのバイトストリームに間接層を配置します。カーネルは、「コントロール-C」又は「コントロール-D」または「コントロール-U」のような特別な値のバイトを検査(すべての設定である、見ることができるman stty
)とSTDINにエンドオブファイルを設定SIGINTを送信する、または消去します入力上の行。バッファリング機能もどこかにあるので、私の「何も保存しない」は多少間違っていますが、ほんの数キロバイトです。
カーネルは出力のバイト値を検査し、改行(ASCIIラインフィード、LFまたは"\n"
)を2バイト、キャリッジリターンとラインフィード(CRLFまたは"\r\n"
)、またはシリアル端末ハードウェアが必要とするバイトに変換します。疑似ttyの間接化により、ハードウェアから独立できます。
疑似ttyでは、すべての「ボーレートの設定」、「パリティの設定」などのioctl()
システムコールもすべて許可され、おそらく何も行われません。これにより、VT-100、ADM-3、Wyseのすべての日に書き戻されたプログラムがエラーなしで機能し続けます。ソフトウェア、擬似ttysデバイスドライバーは、ハードウェアのように動作します。
擬似のttyはによって使用することができるsshd
とtelnet
、彼らはまた、(のような端末エミュレータとの間で使用しているxterm
又はrxvt
)、典型的にはxtermの内部で実行シェル。
Linuxと多くのUnixには擬似ttyがあります。プラン9はそうではありません。疑似ttyは、シリアルケーブルで接続されたハードウェア端末の時代から残された、ちょっとした遺物です。
/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端末アプリと猫は、シェルが出力している同じデバイスからの読み取りを競合しています。
echo Hello > /dev/pts/1
...何が起こるか、それはあなたの端末です。