Windows和Linux中的管道有什么区别?

时间:2008-10-10 16:12:22

标签: language-agnostic ipc pipe named-pipes

Windows和Linux中的管道有什么区别?

4 个答案:

答案 0 :(得分:21)

我所知道的一个区别是,Linux下的命名管道是文件系统中的实际条目(您将在目录列表中看到它们,它们具有特殊类型),而在Windows上它们存储在一些神奇的存储库中某处(它们都是通过“\\。\ pipe \”路径访问的。

其次,在Linux中,您可以使用标准文件IO方法从管道写入/读取,就好像它们是任何其他文件一样。而在Windows上,您必须使用特殊的“管道”功能,它们是Win32 API的一部分。

我更喜欢linux的方法,因为它允许我使用任何我想要的应用程序的管道。例如:

mkfifo pipe.wav
decodeMP3 song.mp3 --out pipe.wav &
encodeAVI video.mpeg pipe.wav --out video.avi

这让我可以将MP3解码器的输出直接输入视频解码器,而不必先将整个MP3解码为磁盘上的WAV文件。如果你有一个双核CPU,这很方便,因为那时你同时运行两个操作,以获得更好的加速。

答案 1 :(得分:5)

在Linux下(和* ix一般),“一切都是文件”。您可以无限制地读/写/寻找管道和插座以及设备,只要这些操作有意义。

虽然Windows对这些不同类型的对象的统一架构要少得多。虽然我无法告诉你细节,但我知道Windows和Linux之间的管道缓冲有很大的不同,所以你可能会遇到困难。

此外,一个常见的Unix-y管道使用是fork()一个子进程,然后通过管道与它通信(父进程打开一端,子进程打开另一端)。在Windows下,这种事情是不可能的。 IPC机制完全不同。

答案 2 :(得分:3)

另见前一个帖子:

What are named pipes?

其中包含我和其他几个人的

答案 3 :(得分:2)

另一个重要的区别

在Windows下

A | B | C 

直到A完成它的输出B没有开始读取,C读取的输出相同

* nix将输入和输出挂钩在一起,这样C可以读取B的输出,B可以在A和B仍在运行时读取A的输出

吞吐量大致相同,但使用* nix时输出显示得更快。