Windows 和 Linux 中的管道有什么区别?
4 回答
我知道的一个区别是,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,它会很方便,因为这样你就可以同时运行这两个操作,以获得很好的加速。
另一个重要的区别
窗户下
A | B | C
直到 A 完成它的输出 B 才开始读取,对于 C 读取的 B 输出也是如此
*nix 将输入和输出挂钩在一起,以便 C 可以读取 B 的输出,而 B 可以在 A 和 B 仍在运行时读取 A 的输出
吞吐量大致相同,但使用 *nix 时输出显示得更快。
在 Linux(和一般的 *ix)下,“一切都是文件”。您可以不受限制地读取/写入/查找管道、套接字和设备,只要这些操作有意义。
而对于这些不同类型的对象,Windows 的体系结构要统一得多。虽然我不能告诉你细节,但我知道 Windows 和 Linux 之间的管道缓冲有很大不同,所以你可能会遇到困难。
此外,一种常见的 Unix-y 管道使用是fork()
子进程,然后通过管道与其通信(父进程打开一端,子进程打开另一端)。在 Windows 下,这种事情是不可能的。IPC 机制完全不同。