12

私が言うとき、私はsedがブロックしていないという印象を持っていました:

iostat | sed

sed到着時にデータを処理しますが、

iostat | sed | netcat

次にsedブロックしnetcatます。

私は正しいですか?

4

4 に答える 4

22

sed端末に出力しない場合は、バッファ モードで動作します。これは、デフォルトで処理と出力を行う前に内部バッファを埋めようとすることを意味します。

これは、スループットを向上させるために行われます。通常、パイプではタイミングは気にしませんが、特定の時間内にできるだけ多くのデータを処理したいからです。

sed に渡す-uと、バッファなしで動作するように指示されるため、出力が端末に送られるときと同じように動作します。

于 2009-02-23T15:08:13.483 に答える
4

@sauaが言うことに加えて、sed少なくとも行指向であり、行を読み取ってから操作するため、常に少なくとも1行をバッファリングします。さらに、sed複数行モードで作業できます。複数行のパターンを使用しているsed場合、パターンが適用されないか、パターンが処理されていることがわかるまで、現在のバッファーを出力できません。

于 2009-02-23T15:12:43.113 に答える
2

質問を正しく理解しているかどうかはわかりませんが、あなたの例では次のようになります。

  • sed は iostat がデータを送信するのを待ちます
  • sed が遅い場合、iostat は sed がデータを処理するのを待ちます。
  • netcat は sed がデータを送信するのを待ちます
  • sed は、遅い場合は netcat を再び待機します。

それ以外では、sed は出力を生成するためにすべての入力を読み取る必要はありません。

これといくつかの小さなバッファリングでは説明できない遅延が見られますか?

于 2009-02-23T15:06:31.320 に答える