我正在使用运行内核 3.2.0 的 Linux 系统。在这个系统上,我编写了一个程序,最终将生成大约 50GB 的数据,然后将其发送到 stdout。我想将此输出重定向到一个文件。
是否会发生某种管道溢出?或者无论数据量有多少,管道都能可靠地工作吗?
答案1
管道不能溢出。管道只是生产者和消费者之间的缓冲区(一定量的内存,在当前系统上很可能是 64KB)。如果生产者生产的速度比消费者消费的速度快,那么生产者受阻(这意味着程序将处于休眠状态)直到消费者通过读取缓冲区再次腾出空间。
此外,您描述的情况在技术上不是管道。如果我们谈论的是 POSIX sh
,重定向到文件 ( acommand > afile
) 会使命令的标准输出直接指向该文件。管道涉及字符|
,碰巧也称为“管道”,是两个正在运行的程序之间的连接:acommand | anothercommand
。
(但话又说回来,幕后真正发生的事情是另一个故事:例如,/dev 下有许多伪设备文件实际上重定向到正在运行的进程。例如,echo Hello World > /dev/pts/1
可能正在写入您当前的 xterm)