シェルでコマンドを実行する

シェルでコマンドを実行する

tty端末でコマンドを実行すると返されます/dev/pts/10

これに加えて、ファイル/dev/stdout /dev/stdinとの/dev/stderrやり取りは端末に直接表示されます。

user@laptop:build$ tty
/dev/pts/10
user@laptop:build$ echo "Test" > /dev/stdout
Test
user@laptop:build$ echo "Test" > /dev/stdin
Test
user@laptop:build$ echo "Test" > /dev/stderr
Test

また、シェルで起動されたすべてのcliアプリケーションはstdout//のファイル記述子を開きますstderrstdinつまり、何かを印刷するスクリプトを実行すると、印刷は書き込みと同じですstdout

これまでstdout//は、シェルが使用できる唯一のインターフェースstderrです。stdinアプリケーションの場合も同様です。

一部のオペレーティングシステムコンポーネントは、最終的に記録されたデータをstdout端末に移動します。それ以外の場合は何も印刷されません。

stdout/stdin/stderrstd*端末の何かと実際にやり取りするために、端末への接続はいつどこで発生しますか?

私が挑戦したいおおよその仮定は次のとおりです。

/dev/stdout、実行中のシェルによって生成され/dev/stdin/dev/stderrシェルがなければ存在しないものです。

シェルは、端末を表す実際のデバイスファイルを介して通信チャネルを設定し、/dev/pts/10端末機能を公開します。このように、シェルは、各アプリケーションが簡単な印刷のためにデバイスファイルを処理する方法を心配することなく、アプリケーションへの単純なファイルインタフェースを提供する。/dev/stdout/dev/stdin/dev/stderr

修正する

疑似端末にもかかわらず、疑似端末/dev/pts/10の概念を導入せずに回答を提供する回答にもっと重点を置きます。私のポイントは、これが質問に対する答えを妨げるだけです。

stdout/stdin/stderr/dev/std*端末の何かと実際にやり取りするために、端末への接続はいつどこで発生しますか?

ベストアンサー1

/dev/pts/10奴隷の終わりは擬似端末装置ペア。もう一方の端には、マスターレプリケーションデバイスを開いてペアで受信するプログラムがあります/dev/ptmx/dev/pts/10開くたびに/dev/ptmx別のスレーブデバイスを取得します)。/dev/ptmxとの間の接続は/dev/pts/10基本的に双方向パイプです。反転がある

ターミナルエミュレータアプリケーションを開くとき:

  • それは開き、/dev/ptmxもう一方の端の名前を取得します。反対側の端を構成して開きます。
  • それはフォーク、
  • 新しいプロセスは、擬似端末装置のもう一方の端を開いて接続する。標準入力標準出力そして標準エラーそれに、
  • 新しいプロセスはシェルを実行します。

シェルはこれら3つのファイル記述子を設定するために何もしません。親プロセスから継承します。同様に、その子プロセスはシェルからファイル記述子を継承します。

コメント:Linuxシステムでは、/dev/stdinおよび/dev/stdoutは一連のシンボリック/dev/stderrリンクを指す物理ファイルであり、これは実際の入力/出力デバイスを指します。あなたの場合です。/proc/<pid>/0/proc/<pid>/1/proc/<pid>/2/dev/pts/10

これら3つの存在標準ストリームCライブラリで保証します。

編集する:更新された質問を解決するために、答えのいくつかのポイントを明確にします。

  • 書かれたすべては、/proc/pts/*それが作成された端末から読み取られ、表示され、読み取られたすべては、/proc/pts/*端末に接続された入力デバイスから来ます。
  • Linuxでは、/dev/stdout通常はにシンボリックリンクされており/proc/self/fd/1、に/dev/stdinシンボリックリンクされています/proc/self/fd/0。仮想/procファイルシステムは、アプリケーションプロセスIDを持つ各アプリケーションへの/proc/selfシンボリックリンクを慎重に表示します。/proc/<pid><pid>
  • /proc/<pid>/fdシンボリックリンクは、アプリケーションが親アプリケーションで開くか継承するファイル、パイプ、およびその他のコンテンツを指します。各アプリケーションは、0入力読み取り、1出力書き込み、2エラー書き込みなど、3つのファイル記述子を開くことが保証されています。あなたに関する限りです/dev/pts/10

出力を別のファイルにリダイレクトせずに、シェルで実行されるすべてのコマンドが端末に書き込まれます。このルールの例外は、コマンドが次のような場合です。プロセスグループ展望とは違うプロセスグループ端末への書き込みが失敗し、SIGTTOUコマンドとして送信されます。stty tostopこの動作を使用して制御できますstty -tostop

stty tostop
echo "/dev/stdout points to the terminal, but I won't print anything" &
stty -tostop
echo "You can see me" &

おすすめ記事