C Windows API - 在 UnmapViewOfFile 之前关闭文件句柄
Posted
技术标签:
【中文标题】C Windows API - 在 UnmapViewOfFile 之前关闭文件句柄【英文标题】:C Windows API - close file handle before UnmapViewOfFile 【发布时间】:2016-07-29 10:55:14 【问题描述】:我想知道这段代码是否为sn-p:
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】:UnmapViewOfFile 的文档说明:
虽然应用程序可能会关闭用于创建文件映射对象的文件句柄,但系统会保持相应文件处于打开状态,直到文件的最后一个视图被取消映射。
所以是的,关闭文件句柄并仍然使用从该文件句柄创建的文件映射对象是安全的。但是,共享限制有一些影响:
最后一个视图尚未取消映射的文件保持打开状态,没有共享限制。
如果您最初打开带有共享限制的文件句柄,则这些共享限制不会由内部句柄维护。您必须决定这在您的特定场景中是否允许。
虽然没有特别要求,但关闭仍然映射的文件映射对象也是安全的。来自CreateFileMapping:
文件映射对象的映射视图维护对该对象的内部引用,并且文件映射对象在对它的所有引用都被释放之前不会关闭。因此,要完全关闭文件映射对象,应用程序必须通过调用UnmapViewOfFile 取消映射文件映射对象的所有映射视图,并通过调用CloseHandle 关闭文件映射对象句柄。 可以按任意顺序调用这些函数。
【讨论】:
谢谢。我错过了这个部分。以上是关于C Windows API - 在 UnmapViewOfFile 之前关闭文件句柄的主要内容,如果未能解决你的问题,请参考以下文章
C Windows API - 在 UnmapViewOfFile 之前关闭文件句柄
windows下C API连接mysql问题 满意加高分 急急!!