0

据我所知,如果我们执行例如“./program | grep someoutput”,它会在程序处理完成后 greps。你知道,如何按收入来做吗?

4

3 回答 3

2

shell 将同时生成两个进程,并将第一个进程的输出连接到第二个进程的输入。如果您有两个长时间运行的进程,那么您将在进程表中看到这两个进程。没有中间步骤,没有存储第一个程序的数据。这是一个管道,而不是一个

注意 - 可能涉及一些缓冲。

于 2012-12-19T13:50:01.317 回答
1

实际上, grep 可以“实时”使用,因为通过管道传递的数据没有被缓冲,所以类似的东西tail -f /var/log/messages | grep something会起作用。

如果您没有得到预期的输出,则很可能前面的命令正在缓冲其输出。以双重grep为例:

tail -f /var/log/messages | grep something | grep another

输出不会立即出现,因为grep 将在 stdout 未连接到终端时缓冲其输出,这意味着第二个 grep 在刷新缓冲区之前不会看到任何数据。强制行缓冲模式解决了这个问题:

tail -f /var/log/messages | grep --line-buffered something | grep another

根据缓冲的完成方式,可以使用stdbuf修改命令的缓冲模式,例如:

stdbuf -oL ./program | grep something
于 2012-12-19T13:52:51.143 回答
1

你错了。

管道立即接收数据,但是如果另一端(接收器)没有足够快地读取数据,源进程写入管道当然会阻塞。

当然,这并不一定意味着管道适合“硬实时”使用,但也许这不是您的意思。

于 2012-12-19T13:49:58.800 回答