dav*_*avr 24

我所知道的一个区别是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
Run Code Online (Sandbox Code Playgroud)

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

  • 投反对票。在 Windows 上,我可以使用 CreateFile、ReadFile、WriteFile、ReadFileEx、WriteFileEx 函数来命名管道。只有服务器必须使用 CreateNamedPipe。有用于同步管道创建和绑定的管道功能,但如果不需要联网管道,可以使用命名等待事件替换这些功能。 (2认同)

lkr*_*itz 7

另一个重要区别

窗户下

A | B | C 
Run Code Online (Sandbox Code Playgroud)

直到 A 完成其输出 B 才开始读取,C 读取 B 输出也是如此

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

吞吐量大致相同,但 *nix 的输出显示速度更快。


Dan*_*ski 5

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

而Windows对于这些不同类型的对象具有远不那么统一的架构.虽然我无法告诉你细节,但我知道Windows和Linux之间的管道缓冲有很大不同,所以你可能会遇到困难.

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

  • Windows 中的子进程显然可以继承管道句柄,所以我想你的意思是 `fork()` 是不可能的。内核可以分叉;这是对基本内存管理器服务的非常直接的使用,但在 Windows API 中实现它几乎是不可能的。即使在 Unix 上,对 fork 的不当使用也可能是一场灾难,而在专为它设计的系统上,人们在创建解决方案时考虑了 fork。 (2认同)