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

Moj*_*o28 3 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);
Run Code Online (Sandbox Code Playgroud)

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

CloseHandle(mapping);
CloseHandle(fhandle);
UnmapViewOfFile(contents);
Run Code Online (Sandbox Code Playgroud)

即我可以先关闭文件句柄然后再打电话UnmapViewOfFile吗?

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

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

IIn*_*ble 10

UnmapViewOfFile的文档说明:

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

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

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

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


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

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