/ dev / ptsファイルには何が保存されていますか?それらを開くことができますか?


73

私の知る限り、/dev/ptsファイルはsshまたはtelnetセッション用に作成されます。


6
echo Hello > /dev/pts/1...何が起こるか、それはあなたの端末です。
セパラードサール


1
@SepahradSalourは、pts番号をそのコンテキストに適合させる必要があります。私のsshdは私のセッションに/ dev / pts / 30を使用しました。
Gab是好人

2
@Gab是好人現在の端末の場所を取得するには、コマンドを使用できますtty
JeromeJ

回答:


110

には何も保存されません/dev/pts。このファイルシステムは純粋にメモリ内に存在します。

のエントリ/dev/pts擬似端末です(略してpty)。Unixカーネルには、端末の一般的な概念があります。端末は、アプリケーションが出力を表示し、端末デバイスを介して入力を受信する方法を提供します。プロセスには制御端末があります。テキストモードアプリケーションの場合、これはユーザーとの対話方法です。

端末は、ハードウェア端末(「tty」、「teletype」の略)または擬似端末(「pty」)のいずれかです。ハードウェア端末は、シリアルポート(ttyS0、…)やUSB(ttyUSB0、...)などのインターフェースを介して、またはPC画面とキーボード(tty1、...)を介して接続されます。疑似端末は、アプリケーションである端末エミュレーターによって提供されます。疑似端末のいくつかのタイプは次のとおりです。

  • xterm、gnome-terminal、konsoleなどのGUIアプリケーションは、キーボードおよびマウスのイベントをテキスト入力に変換し、出力を何らかのフォントでグラフィカルに表示します。
  • 画面やtmuxなどのマルチプレクサアプリケーションは、実際の端末からテキストモードアプリケーションを切り離すために、別の端末との間で入出力をリレーします。
  • sshd、telnetd、rlogindなどのリモートシェルアプリケーションは、クライアント上のリモート端末とサーバー上のptyの間で入出力を中継します。

プログラムが書き込みのために端末を開くと、そのプログラムからの出力が端末に表示されます。複数のプログラムが同時に端末に出力することはよくありますが、出力のどの部分がどのプログラムから来たのかを知る方法がないため、混乱を招く場合があります。それらの制御端末に書き込もうとするバックグラウンドプロセスはSIGTTOU信号によって自動的に中断されるかもしれません。

プログラムが読み取りのために端末を開くと、ユーザーからの入力がそのプログラムに渡されます。複数のプログラムが同じ端末から読み込んでいる場合、各文字はプログラムの1つに独立してルーティングされます。これは推奨されません。通常、特定の時間に端末からアクティブに読み取るプログラムは1つだけです。彼らはしていない間、その制御端末から読み取ろうとするプログラムの前景がされ、自動的にSIGTTIN信号によって中断します

実験するにttyは、ターミナルで実行して、ターミナルデバイスを確認します。と言いましょう/dev/pts/42。別の端末のシェルで、次を実行しますecho hello >/dev/pts/42。文字列helloは他の端末に表示されます。次にcat /dev/pts/42、他のターミナルを実行して入力します。そのcatコマンドを終了するには(他の端末を使いにくくします)、Ctrl+を押しCます。

別の端末への書き込みは、通知を表示するのに役立つ場合があります。たとえば、writeコマンドはそれを行います。通常、別の端末からの読み取りは行われません。


あなたが言いたいことを誤解しているか、あなたの情報がオフになっています。端末に書き込むバックグラウンドプロセスは、SIGTTINになりません。また、複数のプログラムが同時に端末から読み取ることはできません(「各文字は独立してルーティングされる」というステートメント)。端末から読み取ることができるのは常に1つのプログラムのみであり、バックグラウンドプログラムがその端末から読み取ろうとすると、SIGTTINが発生します。これは、SIGTTINが自動的に送信される唯一のケースです。
パトリック

また、別の端末からも読み取ることはできません。これを行うと、データを傍受できるため、セキュリティ上の重大な脆弱性になります。straceプログラムは入力を読み取ることができますが、それだけです。
パトリック

4
@Patrickバックグラウンドプロセスは、端末への書き込みでSIGTTOUを取得しますが、これはタイプミスでした。複数のプログラム同時に端末から読み取ることができます(次の段落で説明する方法で試してみてください。制御端末がその端末ではないプロセスから実行する必要があります)。はい、あなたが所有している限り、別の端末から読むことができます。なぜそれが不可能だと思いますか?
ジル

端末に書き込むバックグラウンドプロセスtostopは、ttyフラグが設定されている場合にのみSIGTTOUを取得します。このフラグはデフォルトでは設定されていません。そして、私は別のTTYからの読み取りを修正しました。私はそれを試してみましたが、動作しますが、文字ごとではなく、読み取りごとです(シェルプロンプトに座っているときは、シェルが一度に1文字を読むのと同じです)。これが私があなたの答えを解釈した方法であるので、この点を明確にすることは良いかもしれません。
パトリック

2
@Patrick確かに、read呼び出しは連続した文字(または、むしろバイト)のみを返しますが、アプリケーションはread呼び出しが返すバイト数を制御できないため、それ以上はありません。
ジル

18

のファイル/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はによって使用することができるsshdtelnet、彼らはまた、(のような端末エミュレータとの間で使用しているxterm又はrxvt)、典型的にはxtermの内部で実行シェル。

Linuxと多くのUnixには擬似ttyがあります。プラン9はそうではありません。疑似ttyは、シリアルケーブルで接続されたハードウェア端末の時代から残された、ちょっとした遺物です。


13

/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」の私がなってしまったhlPTS上/ 4とello wordcatのコンソール)。

ここでの私の推測は、デバイスがシェルから入力を取得し、システムを介してそれを出力していることです。試してください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

入力されるすべての文字には、標準入力からの読み取りと標準出力への書き込みがあります。しかし、シェルの標準出力は何に接続されていますか?straceGUIターミナルで試してみてください-知らない場合は名前を把握する必要があります。たとえば、KDEではkonsole、そしてGNOMEにはがありgnome-terminalます。それからの出力straceはたぶんより不可解です-私にはたくさんがpoll()ありrecvfrom()ます。書き込みは表示されませんが、cat別の端末からトリックを取得すると、タイプすると、catによって読み取られるキーストロークがstrace出力にまったく応答しなくなります。それらを受け取る。そのため、GUI端末アプリと猫は、シェルが出力している同じデバイスからの読み取りを競合しています。


立ち往生しているときの「cat / dev / pts / 4」の使用と、このコマンドの実行中に立ち往生している理由
user2720323

これを説明するためにいくつかの段落を追加しました。
-goldilocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.