12

我的印象 sed 没有阻塞,因为当我说:

iostat | sed

sed在数据到达时处理数据,但是当我这样做时

iostat | sed | netcat

然后sednetcat

我对吗?

4

4 回答 4

22

sed当它不打印到终端时,它将在缓冲模式下工作。这意味着默认情况下它会在进行任何处理和输出之前尝试填充其内部缓冲区。

这样做是为了增加吞吐量,因为通常在管道中您不关心时间,但希望在给定时间内处理尽可能多的数据。

传递-u给 sed 将告诉它无缓冲地工作,因此它的工作方式与输出到终端时的工作方式相同。

于 2009-02-23T15:08:13.483 回答
4

除了@saua 所说的,sed它至少是面向行的,它读取一行,然后对其进行操作,因此它将始终缓冲至少一行。此外,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 回答
1

stdbuf可以帮助更改标准 io 流的缓冲行为。你可以试试这个来改变缓冲行为:

... | stdbuf -oL -eL sed -e ... | ...
于 2016-02-10T14:50:49.130 回答