Fifo文件Windows示例

20

我想知道是否有Windows对应Linux的mkfifo。对于对应,我的意思是创建文件的方法,使用st_mode S_IFIFO

谢谢回答。


Windows系统并没有“一切皆文件”的抽象概念,你需要使用命名管道来代替。从内核对象命名空间中通过名称找回它并不是一个问题。 - Hans Passant
我只是问一下,因为Windows定义了_S_IFIFO,但可能仅为了某些向后兼容性。此外,来自Linux的ntfs-3g将某些文件识别为S_IFIFO。 - Patrik Polakovic
嗯,你发现了在stat.h中,这是微软不得不模拟的头文件。虽然从技术上讲可以通过包装命名管道句柄来实现,但它仍然不是一个文件。 - Hans Passant
1个回答

10

在某种程度上,可以模拟mkfifo的行为。我很多年前为类似于WinXX的OS/2实现了这样的功能。

主要限制是Windows为管道使用保留文件名\\.\pipe\pipename或者\\servername\pipe\pipename(在网络上非常有用)。 但是,你无法直接使用任意fifo名称。管道名称需要加上 \\.\pipe\ 前缀。

然而,一个应用程序可以使用 CreateNamedPipe 创建具有 PIPE_ACCESS_DUPLEX 和 GUID 名称的管道,并使用 DeviceIoControl / FSCTL_SET_REPARSE_POINT 在目标目录中创建该管道的符号链接。这应该与 mkfifo 很接近。

缺点是服务管道的应用程序必须在管道实例存在期间运行。当然,它应该在终止时清理符号链接。 此外,它需要从管道中读取所有数据并将其再次写回。不确定是否可以使用零拷贝来实现。

还有一些其他方面。例如,如果您想能够删除您模拟的FIFO,则需要跟踪符号链接的删除并在这种情况下终止工作进程。

很抱歉,我没有Windows开发环境,无法测试这种方法。


谢谢您的回复。我并不是真的想创建这样的文件。我之所以问,是因为在Linux系统上,ntfs-3g驱动程序实际上会将NTFS分区上的某些文件识别为FIFO\SOCKET。从这样的文件中读取会意外地挂起。这是ntfs-3g FUSE驱动程序的特性。`> fsutil file createnew fifo 0 > fsutil file createnew socket 1 > attrib +S -H fifo > attrib +S -H socket` - Patrik Polakovic
我尝试创建一个符号链接到以 \\.\pipe 开头的路径,但是无法使其工作。请参见问题。 - IS4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接