Language agnostic Windows和Linux中管道的区别是什么?

Language agnostic Windows和Linux中管道的区别是什么?,language-agnostic,ipc,pipe,named-pipes,Language Agnostic,Ipc,Pipe,Named Pipes,Windows和Linux中的管道有什么区别?我知道的一个区别是,Linux下的命名管道是文件系统中的实际条目(您可以在目录列表中看到,它们有一种特殊类型),而Windows上的管道存储在某个神奇的存储库中(它们都是通过路径访问的)“\.\pipe\” 其次,在Linux中,您可以使用标准的文件IO方法,将管道作为任何其他文件进行写入/读取。而在windows中,您必须使用Win32 API中的特殊“管道”函数 我更喜欢linux的方法,因为它可以让我在任何我想要的应用程序中使用管道。例如: m

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,这会很方便,因为这样您可以同时运行这两个操作,以获得很好的加速效果。

在Linux下(通常是*ix),“一切都是一个文件。”“。只要这些操作合理,您可以无限制地读取/写入/查找管道、插座和设备

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


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

另请参阅上一个线程:


这包含了我和其他几个民族的另一个重要区别

窗下

A | B | C 
直到A处理完它的输出B才开始读取,C读取B输出也是如此

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


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

Downvote。在Windows上,我可以使用CreateFile、ReadFile、WriteFile、ReadFileEx、WriteFileEx函数来命名管道。只有服务器必须使用CreateNamedPipe。有用于同步管道创建和绑定的管道函数,但可以使用name来替换这些函数d如果不需要网络管道,则等待事件。Windows本地命名管道使用下面的内存映射文件。这意味着管道将数据存储在内存或pagefile.sys中。Windows不使用根文件系统,而是在注册表中保留根对象树并动态填充。
\.\
\?\
与UNC类似前缀(它们不是真正的UNC)被映射到本机对象管理器
\??
虚拟目录。这在
\Sessions\0\DosDevices\[logon ID]中的登录会话设备链接中查找
然后系统设备链接到
\Global???
。系统设备
\Global???\Pipe
是指向
\device\NamedPipe
的对象符号链接。该设备由NamedPipe文件系统管理(即对象树中的
\FileSystem\Npfs
)。您可以列出系统上的所有命名管道。它不支持真正的目录,但创建管道时通常会在名称中使用反斜杠来模拟这一点,例如
\Device\NamedPipe\Winsock2\CatalogChangeListener-xxx-0
@vincent,我不完全理解您问题的意图。管道文件是在命名管道文件中创建的stem,安装在管道设备的根路径上,即“//./pipe/”。您可以通过
FindFirstFileW(L////pipe/*”、&findData)
FindNextFileW
在目录中列出管道。您可以通过
GetFileAttributesW(L//pipe/SomeNamedPipe”)检查命名管道的存在性
,但它确实使用管道连接。如果由于
错误\u pipe\u BUSY
(231)而失败,则管道存在,但没有可用的实例。Windows中的子进程显然可以继承管道句柄,因此我想你的意思是
fork()
是不可能的。内核可以使用fork;这是对基本内存管理器服务的一种非常直接的使用,但在Windows API中实现这一点几乎是不可能的。即使在Unix上,不正确使用fork也可能是一场灾难,而在为它设计的系统上,人们正在创建考虑fork的解决方案。这是我想要的是:我似乎记得是这样,但不确定。Thx!这样做的结果是,UNIX上的缓冲区大小可以小得多。UNIX管道允许您处理任意数量的数据,而Windows管道在处理足够的数据时会停下来。