调用GetFileAttributesW()将删除管道

Calling GetFileAttributesW() removes a pipe

本文关键字:删除 管道 GetFileAttributesW 调用      更新时间:2023-10-16

我从进程a、创建了一个超时时间很长的管道(//./pipe/mycolpipe)

pipe = ::CreateNamedPipe(
        name_.c_str(),
        direction_,
        PIPE_TYPE_BYTE | PIPE_WAIT,
        1,
        ...,
        ...,
        PIPE_TIMEOUT,
    );

MS sysinternals pipelist.exe正在枚举我的管道:

pipelist.exe | grep mycoolpipe
 //./pipe/mycoolpipe

然后从进程B中,我想读取文件属性:

::GetFileAttributesW(p.c_str()) // p == //./pipe/mycoolpipe

在调用GetFileAttributesW之后,管道就不见了-什么?为什么

注意:事实证明,执行GetFileAttributesW会导致管道消失-pipelist.exe在调用GetFileAttributesW后不会再枚举它。不涉及超时。

GetFileAttributesW()对非文件系统对象有未定义的行为,所以不要这样做。

http://permalink.gmane.org/gmane.os.cygwin.patches/1973

https://cygwin.com/ml/cygwin-patches/2004-q2/msg00193.html

但是,尽管//server/pipe/name可能是UNC路径,但它不是文件的路径。并且某些Win32函数(包括GetFileAttributes)不起作用那些路径。当我说"不工作"时,我的意思是Win32 SDK实际上说不要在这些路径上调用它们,当我在XP Pro SP1上调用它们时(更新),奇怪的行为随之而来这是未定义的行为。有时我可以使用SysInternals的FileMon查看文件系统级别的奇怪内容

没有为管道路径定义GetFileAttributes行为。因此,不能在这些道路上调用它。我相信在打开和关闭管道,更改服务器的语义之后,它在我的XP系统上返回-1!但无法保证它在其他系统上会得到什么回报。

我们面临的是Win32 API的失败:
1) 不能在管道路径上调用GetFileAttributes
2) 没有任何函数可以告诉你路径是管道路径,除非你真正打开它并使用GetFileType——这会改变服务器语义
3) 因此,必须检测管道路径并避免调用GetFileAttributes