调用GetFileAttributesW()将删除管道
Calling GetFileAttributesW() removes a pipe
我从进程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
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 调用GetFileAttributesW()将删除管道