【问题标题】:What buffers are between commands in a pipeline?管道中的命令之间有哪些缓冲区?
【发布时间】:2018-06-25 16:51:25
【问题描述】:

我以为是 1 个缓冲区,但现在我突然想到它可能是 2 个。

我的意思是在管道中:

cmd1 | cmd2

cmd2 的输出可能是例如行缓冲,那里没有管道。这应该是由 libc FILE *fwrite() 这样的流函数管理的缓冲区,还是 write(3) 也使用这个缓冲区?但是,我只记得pipe(7) 谈到了显然在内核中控制的管道缓冲区的大小。

stdin 也被缓冲了吗?是否有 3 个缓冲区,1 个在内核空间,2 个在用户空间?

我之前认为read(2) 在管道缓冲区为空时挂起,但是当 stdin 不是管道而是终端时,我没有管道缓冲区,对吗?如果它没有自己的缓冲区,它是否会根据标准输入是管道还是终端还是常规文件来检查不同的缓冲区?

编辑:将问题中的“多少”更改为“什么”。我希望这不是太大的变化。我有兴趣知道缓冲区是什么,而不仅仅是一个数字。

【问题讨论】:

    标签: linux pipe libc piping


    【解决方案1】:

    stdin 也被缓冲了吗?是否有 3 个缓冲区,1 个在内核空间,2 个在用户空间?

    是的,一般来说这里可能有 3 个缓冲区:一个用于cmd1stdout,一个用于cmd2stdin,一个用于内核空间。

    我之前认为read(2)在管道缓冲区为空时挂起,但是当stdin不是管道而是终端时,我没有管道缓冲区,对吧?

    read 系统调用在没有输入时阻塞,但这与stdio 缓冲无关

    无论输入是否来自终端,内核缓冲区都存在(内核一次传输一个字符会非常低效)。

    默认 stdio 库不会缓冲终端输入,但应用程序可以通过显式调用来改变它,例如setvbuf.

    更详细的博文是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2016-02-26
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多