管道和流到底有什么区别?

管道和流到底有什么区别?

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

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

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

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

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

这些流是通过管道传输的吗?

答案1

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

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

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

答案2

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

相关内容