C Windows API - 在UnmapViewOfFile之前关闭文件句柄

时间:2016-04-08 08:39:33

标签: c winapi createfile file-mapping

我想知道是否为此代码段:

HANDLE fhandle = CreateFile("something.c", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE mapping = CreateFileMapping(fhandle, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID map_view = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);

以下释放对象的顺序有效:

CloseHandle(mapping);
CloseHandle(fhandle);
UnmapViewOfFile(contents);

即。我可以先关闭文件句柄并在之后调用UnmapViewOfFile吗?

我知道CloseHandle(mapping)UnmapViewOfFile(contents)的执行顺序无关紧要,但是关闭文件句柄呢?

我在问,因为我只想使用map_view指针来构造析构函数。在我看来,这是有效的,文件一直保持到调用UnmapViewOfFile,但这可能会导致一些奇怪的行为?

1 个答案:

答案 0 :(得分:10)

UnmapViewOfFile的文档说明:

  

虽然应用程序可能会关闭用于创建文件映射对象的文件句柄,但系统会保持相应的文件处于打开状态,直到文件的最后一个视图未映射为止。

所以是的,关闭文件句柄并仍然使用从该文件句柄创建的文件映射对象是安全的。但是,对共享限制有影响:

  

尚未取消映射最后一个视图的文件将保持打开状态,没有共享限制。

如果您最初打开具有共享限制的文件句柄,则内部句柄不会维护这些共享限制。您必须决定在特定情况下是否允许这样做。


虽然没有特别要求,但关闭仍然映射的文件映射对象也是安全的。来自CreateFileMapping

  

文件映射对象的映射视图维护对该对象的内部引用,并且在释放对它的所有引用之前,文件映射对象不会关闭。因此,要完全关闭文件映射对象,应用程序必须通过调用UnmapViewOfFile取消映射文件映射对象的所有映射视图,并通过调用CloseHandle来关闭文件映射对象句柄。 可以按任何顺序调用这些函数。