管道和流之间究竟有什么区别?

use*_*856 12 pipe

我阅读了有关管道和流的内容,但仍然对它的实现方式感到困惑。

一个程序启动并从“标准输入”流(stdin)中读取数据,这是键盘将数据发送到的地方。

我的问题是,这与管道有什么不同?管道允许我有一个进程将数据发送到管道,另一个进程正在从中读取数据。

当按下键盘时,数据被发送到标准输入,一个程序正在从同一个流中读取数据。

一旦数据发送到这个流,就会执行“读取”操作,就像管道一样。

这些流是管道传输的吗?

Mar*_*ick 9

Unix 终端 i/o 传统上被实现为某种队列。较旧的内核使用 clists。V8 Unix 使用。在大多数情况下,clist 和流用于实现用户进程(特别是文件描述符)和字符设备驱动程序(例如,串行端口或 pty)之间的一部分链接。

管道也是一个队列,但它们链接用户进程(特别是一对文件描述符)。管道有多种实现方式,包括套接字;一种特殊类型的文件;甚至 STREAMS(STREAMS 是 V8 流的衍生物。)

因此,流和管道都是队列的实现,但它们用于不同的情况。


Joh*_*ohn 7

从技术角度来看,这可能不完全准确,但可能会帮助您混淆。我倾向于认为流是程序固有的东西,例如 STDIN、STDOUT 和 STDERR,而管道是程序的外部。例如,在命令中cat foo.txt | grep barcat命令发送到它的固有 STDOUT,然后外部管道将它连接到它grep的固有 STDIN。