あるコマンドが別のコマンドにパイプされると、パイプ出力はどのような形式または形式で存在/送信されますか?一時ファイルですか?文字列ですか?パイプ出力を受け取るコマンドはどのようにその出力をデコード/読み込みますか?
例:
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
標準入力に接続するためにディスクを使用しません。more
I/O リダイレクト演算子に関して、上記のコマンドは次のコマンドの順序と同じです。
$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp
答え2
./program
echo
出力をファイルとして受け取ります。標準ストリームファイル/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
これはビットストリームの形で行われます。送信方法と受信方法は次のとおりです。インターフェースはファイル記述子(またはハンドル)。単純なファイルもこの方法で処理できます。
望むより: