簡體   English   中英

C Windows API - 在UnmapViewOfFile之前關閉文件句柄

[英]C Windows API - close file handle before UnmapViewOfFile

我想知道是否這個代碼片段:

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使用map_view指針進行析構函數。 在我看來,這是有效的,文件一直保持到調用UnmapViewOfFile ,但這可能會導致一些奇怪的行為?

UnmapViewOfFile的文檔說明:

雖然應用程序可能會關閉用於創建文件映射對象的文件句柄,但系統會保持相應的文件處於打開狀態,直到文件的最后一個視圖未映射為止。

所以是的,關閉文件句柄並仍然使用從該文件句柄創建的文件映射對象是安全的。 但是,對共享限制有影響:

最后一個視圖尚未取消映射的文件將保持打開狀態,沒有共享限制。

如果您最初打開具有共享限制的文件句柄,則內部句柄不會維護這些共享限制。 您必須決定在特定情況下是否允許這樣做。


雖然沒有特別要求,但關閉仍然映射的文件映射對象也是安全的。 CreateFileMapping

文件映射對象的映射視圖維護對象的內部引用,並且文件映射對象在釋放對它的所有引用之前不會關閉。 因此,要完全關閉文件映射對象,應用程序必須通過調用UnmapViewOfFile取消映射文件映射對象的所有映射視圖,並通過調用CloseHandle來關閉文件映射對象句柄 可以按任何順序調用這些函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM