19

我想知道是否有适用于 Linux mkfifo 的 Windows 等效项。等效地,我的意思是使用st_mode S_IFIFO创建文件的方式。感谢您的回答。

4

1 回答 1

8

应该可以在某种程度上mkfifo模仿这种行为。多年前我已经为 OS/2 实现了类似的东西,它在文件系统方面与 WinXX 非常相似。

主要限制是 Windows 使用保留的管道文件名:\\.\pipe\ pipename\\ servername \pipe\ pipename通过网络(这可能非常有用)。但是您将无法直接使用任意 fifo 名称。管道名称需要 \\.\pipe\ 前缀。

但是,应用程序可以使用GUID 名称创建管道CreateNamedPipe,并使用/在目标目录中创建指向该管道的符号链接。这应该非常接近。PIPE_ACCESS_DUPLEXDeviceIoControlFSCTL_SET_REPARSE_POINTmkfifo

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

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

对不起,我没有 Windows 开发环境,所以我无法测试这种方法。

于 2017-11-12T11:27:39.843 回答