任何句柄关闭后,CreateFile FILE_FLAG_DELETE_ON_CLOSE失败

时间:2015-04-13 21:33:10

标签: c++ windows memory-mapped-files

我们创建一个文件用作memorymappedfile。

我们以GENERIC_READ | GENERIC_WRITE打开 我们使用FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE分享 我们使用文件属性FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE

我们成功创建了该文件。我们可以使用相同的标志重复打开它多次。

关闭一个句柄后,我们再也无法打开句柄,它将返回ERROR_ACCESS_DENIED。我们可以通过关闭任何句柄来解决这个问题,第一个是CreateFile(ALWAYS_CREATE),另一个来自CreateFile(OPEN_EXISTING)。

有什么方法可以避免这种情况吗?我们使用memoryMappedFile作为必须共享资源的不同进程之间的通信。这些过程有时会启动和停止。现在,一旦我们关闭一个句柄,我们就无法打开memorymapped文件。

我尝试更改open调用以使用FILE_ATTRIBUTE_NORMAL,因此只有create调用使用CLOSE_ON_DELETE,但这对这种情况没有影响。

2 个答案:

答案 0 :(得分:9)

您遇到的问题是,一旦打开FILE_FLAG_DELETE_ON_CLOSE文件句柄,操作系统将不再允许创建新句柄。

血腥的细节:当处理为关闭时删除而打开的文件IRP_MJ_CLEANUP(即关闭句柄的情况)时,Windows文件系统将在文件对象上设置一个内部标志,指示这是它的出路。使用STATUS_DELETE_PENDING对文件的后续打开尝试将失败,Win32子系统将映射到您看到的Win32 ERROR_ACCESS_DENIED代码。

对于您的用例,您可能需要考虑使用Named Shared Memory (MSDN)模式。基本上,让操作系统管理共享内存的空间。只需确保您应用适当的安全属性,就可以了。

答案 1 :(得分:0)

在他的Microsoft开发博客The Old New Thing上,古老的Raymond Chen replied证明了这一点。如雷蒙德(Raymond)在他的文章中所说,Bukes是正确的,但可以选择:

  

只要任何打开的句柄继续引用该文件,似乎他们真的希望文件保持有效(包括允许进一步的Create­File调用成功)。幸运的是,客户只需要使用句柄即可创建内存映射视图。文件指针并不重要。因此,客户可以使用Duplicate­Handle而不是Create­File来获取文件的其他句柄。由于所有句柄都引用同一个文件对象,因此在关闭所有句柄之前,文件对象不会删除文件。

相关问题