あるコマンド/プログラムから別のコマンド/プログラムにパイプされた出力を送受信する形式は何ですか? [コピー]

あるコマンド/プログラムから別のコマンド/プログラムにパイプされた出力を送受信する形式は何ですか? [コピー]

あるコマンドが別のコマンドにパイプされると、パイプ出力はどのような形式または形式で存在/送信されますか?一時ファイルですか?文字列ですか?パイプ出力を受け取るコマンドはどのようにその出力をデコード/読み込みますか?


例:

echo "Someone string" | ./program | tail

programプログラム ""は出力をファイルとして受け取りますか?echoプログラムはこの入力をどのように読みますか?

答え1

パイプは、Linuxや他のUnix系オペレーティングシステムで使用されるリダイレクト(標準出力を別のターゲットにパイプする)の一形態です。 。 Unix / Linuxシステムでは、あるコマンドのstdoutを別のコマンドのstdinに接続できます。これを実現するには、パイプ文字「|」を使用できます。

パイプは、2つ以上のコマンドを結合するために使用されます。ここで、あるコマンドの出力は別のコマンドの入力として使用され、そのコマンドの出力は次のコマンドの入力として使用できます。 2つ以上のコマンド/プログラム/プロセス間の一時的な接続と見なすこともできます。追加処理を実行するコマンドラインプログラムをフィルタと呼びます。

コマンド/プログラム/プロセス間のこれらの直接接続を介して同時に実行することができ、一時テキストファイルまたはディスプレイを介してデータを渡さずにデータを継続的に転送できます。パイプは一方向です。つまり、データはパイプを通って左から右に流れます。

通事論:

command_1 | command_2 | command_3 | .... | command_N 

例:moreコマンドへの入力として、すべてのファイルとディレクトリを一覧表示します。

$ ls -l | more 

このmoreコマンドは出力をls -l入力として使用します。このコマンドの最終的な効果は、ls -l一度に1つの出力画面を表示することです。パイプはコンテナとして機能し、出力を受け取り、ls -lそれをmore入力に渡します。このコマンドはパイプがメインメモリに実装されているため、標準出力をls -l標準入力に接続するためにディスクを使用しません。moreI/O リダイレクト演算子に関して、上記のコマンドは次のコマンドの順序と同じです。

$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp

もっと12サム

答え2

./programecho出力をファイルとして受け取ります。標準ストリームファイル/dev/stdin。デモ:

echo foo | wc -c
echo foo | wc -c /dev/stdin

出力:

4
4 /dev/stdin

注:ストリームファイルはディスクに保存されているファイルとは多少異なります。私たちはできるデータへのランダムアクセス通常のファイルにはありますがストリームメディア文書。 CDプレーヤーと曲を再生するラジオの違いと同じです。 CDプレーヤーでは、曲を巻き戻し、早送り、検索、スキップなどができます。ラジオは放送局が送信するすべてを単に出力(またはストリーミング)します。

ストリームはどこに保存されますか?オペレーティングシステムはそれを一時ストレージに保存します。データバッファ、オペレーティングシステムによってサイズが異なります。バラよりパイプバッファはどれくらい大きいですか?


より低いレベルでは、オペレーティングシステムは以下を使用します。ファイル記述子、ファイル名ではありません。ファイル記述子はただ数字の束であり、各数字はプロセス識別子独自のスタックがあります。 Linuxでは、/dev/stdinストリーム(常にファイル記述子)へのアクセスも許可します。「0」)、そのように:

echo foo | wc -c /proc/self/fd/0

出力:

4 /proc/self/fd/0

別のLinux抽象化はutilを通して見ることができますrealpath

realpath /dev/stdin /proc/self/fd/0

出力(私のシステムの現在の端末):

/dev/pts/2
/dev/pts/2

この文字ptsセウド時間端末S。最後の2数字は端末ごとに常に異なるため、信頼できる名前ではありませんが、次のトリックに数字を使用できます。新しいパイプやファイルを作成せずにある端末から別の端末に出力を送信する方法

答え3

これはビットストリームの形で行われます。送信方法と受信方法は次のとおりです。インターフェースはファイル記述子(またはハンドル)。単純なファイルもこの方法で処理できます。

望むより:

関連情報