Windows和Linux管道之间有什么区别?

问题描述:

Windows和Linux管道有什么区别?Windows和Linux管道之间有什么区别?

我知道的一个区别是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

Downvote。在Windows上,我可以使用CreateFile,ReadFile,WriteFile,ReadFileEx,WriteFileEx函数来命名管道。只有服务器必须使用CreateNamedPipe。有管道的功能用于管道创建和绑定的同步,但如果不需要联网管道,可以使用命名的等待事件来替换这些功能。 – 2013-01-25 10:06:49

+1

而Windows本地命名管道在下面使用内存映射文件。这意味着管道将数据存储在内存或pagefile.sys中。 – 2013-01-25 10:14:17

在Linux(和* ix一般)下,“​​一切都是文件”。您可以在没有限制的情况下读取/写入/查找管道和套接字和设备,只要这些操作合理。

尽管Windows对于这些不同类型的对象有着非常不统一的体系结构。虽然我不能告诉你细节,但我知道Windows和Linux之间管道的缓冲区有很大不同,所以你可能会遇到困难。另外,Unix-y管道的一个普通用途是fork()一个子进程,然后通过一个管道(父进程打开一端,子进程打开另一端)与进程通信。在Windows下,这种事情是不可能的。 IPC机制完全不同。

又见一篇主题:

What are named pipes?

其中包含我采取和其他几个民族

另一个重要区别

在windows下

A | B | C 

,直到完成了它的输出吨B不开始读取,同为B输出被C

读取

* nix的钩的输入和输出在一起,使得C能够读取B的输出和B可以读取A的输出,而A和B仍在运行

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