0

パイプがどのように機能するかを正確に説明してください。たとえば、このコードのスニペットがあります

set line = ($<)

while(${#line} != 0)
 if(${#line} == 5) then 
  echo line | sort | ./calculate ${1}
 endif 
 set line = ($<)
end

5 つの単語を含むすべての行を選択し、並べ替え後と転送後に選択する必要がありますが、どのように機能するのか混乱しています。まず、「while」がすべての情報を取得し、その後、並べ替えに転送するか、反復ごとに ' while' はソートを行いますか? 前もって感謝します

4

3 に答える 3

3

OPが内部を気にする場合、パイプは循環バッファとして実装されることがよくあります。つまり、OS はメモリのチャンクを確保し、現在使用中のセグメントを追跡します (必要に応じて最後から最初にラップアラウンドします)。

+-------+
| front |
+-------+
      |             +-------+
      |             | back  |-------\
      V             +-------+        V
+---+---+---+---+---+      +---+---+----+---+---+---+
|   | c | o | n | t |  ... | e | r | \n |   |   |   |  // the buffer itself
+---+---+---+---+---+      +---+---+----+---+---+---+

そして、次のルールで動作を制御します。

  • ラップアラウンド動作は、すべての位置演算をバッファー長を法として行うことによって実現されます (言語が 1 インデックス付き配列を使用する場合は注意してください!)。
  • frontとが常に同じである場合back(開始条件と同じ)、パイプは空であり、パイプからの読み取りの試行は、読み取るものがあるまでブロックされます。
  • backである場合(front-1)(モジュロの長さ、覚えておいてください!)、バッファがいっぱいで、書き込みの試行は空きができるまでブロックされます。
  • パイプから値を読み取ると、 の内容が返されfront、前に 1 つ進みます。
  • パイプに値を 1 つ書き込むbackと、この位置に新しい入力が挿入されます。

必要がありメモリが利用可能な場合にバッファを拡張できるようにすることを含む、より複雑なスキームが可能です (実際に一般的です)。上記は、バッファ自体の長さを 1 文字だけにすることで簡略化できます (つまり、フロントとバックはもう必要ありません) しかし、多くのロックと多くの不必要なコンテキスト スイッチの点でコストがかかります。

于 2010-06-01T13:50:15.273 に答える
2

すべての反復でコマンドを実行しているためecho line | sort | ./calculate ${1}、毎回個別に実行されます。パイプは、左側のコマンドの出力を受け取り、それを右側のコマンドの入力に送ります。

于 2010-06-01T13:06:16.203 に答える
1

パイプとは、入力を読み取り、同時に出力を生成するものです。たとえば、小文字で構成された入力を受け取るパイプを持つことができ、パイプは変更されます (入力の元のソースを変更せずに、データファイルなど) 入力データを大文字に変更します。

パイプは左から右に処理されます。

エコーライン | ソート | ./${1} を計算

lineにパイプされsortます。Sort次に、入力データをソートしてデータを出力します。データは、calculate何らかの入力を期待しているプロセスにパイプされます。

これを次のように視覚化する方が簡単かもしれません。チューブまたはプラスチック パイプ (雨どいの種類) と考えてください。

入力 <---+---> 出力
          | |
         パイプ

編集:

元の質問で、C シェルに基づくコード スニペットを解釈するように求められたので、これ以上苦労せずに...

1. set line = ($<)
2. while(${#line} != 0)
3. if(${#line} == 5) その後
4. エコーライン | ソート | ./${1} を計算
5.エンディフ
6. set line = ($<)
7.終了
  1. 標準入力またはファイルから入力を受け取ります (これは、「this_script < data file」または「cat data_file | this_script」を実行して、ファイルをこのスクリプトにリダイレクトすることで実行できます。
  2. EOF に到達するまでループして読み取ります (Unix/Linux バリアントでは Ctrl+D、Windows では F6 キー)
  3. 行数が 5 行、つまり最初の 5 行に達した場合、それは私を悩ませている部分であり、100% の自信はありませんが、さらに説明を続けます..
  4. 5行はエコーされて出力されますが、パイプのため、出力はソートへの入力になり、ソートはその入力から読み取り、データをソートして出力しますが、さらに別のパイプのために、 calculate は、ソートされた出力から入力を受け取ります。
  5. lineより多くの入力を含むように変数を設定します。そして再びループします。

そして、あなたのコメントに答えるために、必要に応じてパイプを追加できます。次のように 4 行目を強調表示します。

エコーライン | ソート | ユニーク | ./${1} を計算

ちなみに、私の記憶が正しければ、そうlineすべきだと思います。$line

于 2010-06-01T13:11:27.120 に答える