首页 > 解决方案 > 管道中的命令之间有哪些缓冲区?

问题描述

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

我的意思是在管道中:

cmd1 | cmd2

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

标准输入是否也有缓冲?是否有 3 个缓冲区,1 个在内核空间,2 个在用户空间?

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

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

标签: linuxpipelibcpiping

解决方案


标准输入是否也有缓冲?是否有 3 个缓冲区,1 个在内核空间,2 个在用户空间?

是的,通常这里可能有 3 个缓冲区:一个用于cmd1 stdout,一个用于cmd2 stdin,一个在内核空间中。

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

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

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

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

此处有包含更多详细信息的博客文章。


推荐阅读