Bash Pipe処理

Bash Pipe Handling

出典: link タグ:linuxbashpipedevice 更新時間:

  問題

誰もがbashがパイプを介してデータを送信する方法を知っていますか?

 cat file.txt | tail -20
 

このコマンドはfile.txtのすべての内容をバッファに出力しますか?それとも、このコマンドは、たとえば、file.txtの内容を1行ずつ印刷し、テールを処理するために各行で一時停止し、さらにデータを要求しますか?

私が尋ねる理由は、基本的に1つの操作の出力が次の操作の入力として送信されるデータの一連の操作を実行する組み込みデバイス上にプログラムを書いているからです。私はlinux(bash)がこれをどのように処理するのか知りたいので、 "cat file.txt | tail -20"を実行したときに具体的に何が起こるかではなく、一般的な答えを教えてください。

あなたの回答を事前にありがとう!

編集:Shog9は関連するWikipediaの記事を指摘しましたが、これは私に直接記事に導かれませんでしたが、それは私がこれを見つけるのを助けました: http://en.wikipedia.org/wiki/Pipeline_%28Unix%29#Implementation 私が探していた情報を持っていました。


私は自分自身を明確にしていないことを申し訳ありません。もちろん、パイプを使用しています。もちろん、コマンドのそれぞれの部分のstdinとstdoutを使用しています。私はそれが状態にはあまりにも明白だと思っていました。

私が求めているのは、これがどのように処理/実装されているかです。両方のプログラムが一度に実行できないため、stdinからstdoutにデータがどのように送信されますか?最初のプログラムが2番目のプログラムよりも大幅に高速にデータを生成する場合はどうなりますか?システムは終了するか、stdoutバッファがいっぱいになるまで最初のコマンドを実行し、次のプログラムに移動します。

  ベストアンサー

もう少し詳しい説明を書くことにしました。

"magic"はオペレーティングシステムにあります。両方のプログラムはほぼ同時に起動し、同時に実行されます(オペレーティングシステムは、コンピュータ上の他のすべての実行中のプロセスと同時に(端末アプリケーションとカーネルを含む)。したがって、データが渡される前に、プロセスは必要な初期化を行っています。あなたの例では、tailは '-20'引数を解析し、catは 'file.txt'引数を解析してファイルを開きます。ある時点で、tailは入力ポイントを取得するポイントを取得します。 catシステールバッファインプロセッファインバッファインバッファインバッファインションバッファインバッファインプロッファインバッファインプロッファインバッファは最後に入力されますべていくられます。

複数のプロセッサを持つシステムでは、2つのプログラムは同じプロセッサコア上で交互にタイムスライスを共有するだけでなく、別々のコアで同時に実行される可能性があります。

もう少し詳しく説明するために、Linuxで 'top'のようなプロセスモニタ(オペレーティングシステム固有)を開くと、実行中のプロセスのリスト全体が表示されます。ほとんどのアプリケーションでは、データを処理していない限り、ほとんどの時間は何もしません。これは良いことです。なぜなら、他のプロセスが必要に応じてプロセッサに自由にアクセスできないようにすることができるからです。これは基本的に3つの方法で達成されます。プロセスは、基本的にスリープ(n)スタイルを取得することができます。このプロセスは、ファイルの実行時間を待機するためには、ほとんどの時間待ち時間です。

コンピュータ上で行うほとんどの操作は IO バインドです。 これは通常、ハードディスクやネットワークデバイスなどからのデータを待っているということです。

  同じタグがついた質問を見る

linuxbashpipedevice