2017-10-19 129 views
1

我得到macOS的場景,我不能關閉內存映射文件沒有 解除它首先(使用munmap syscall),雖然關閉系統調用返回成功結果(= 0)我仍然可以在lsof -n中看到文件記錄。內存映射文件不能關閉沒有未映射,因爲它仍然被引用

在linux中,它明確提到,closing the file doesn't unmap the file,根據MMAP手冊頁。

是它確實是2和操作系統之間的不同的行爲? 對這種不同的行爲有任何解釋嗎?

編輯:閱讀下面的評論後,我已經意識到,有平臺之間沒有任何不同的行爲,以及爲什麼我的文件仍然打開的原因是因爲它仍然被MMAP引用。

感謝

+0

難道使用模式是在Linux中之間你的網站與MacOS的有什麼不同?我期望在文件實際關閉之前關閉*和*取消映射文件是必要的。 Linux可能對命令無動於衷,但也許MacOS關心首先完成。 – wallyk

+1

由於mmap文件仍在使用中,您所做的只是關閉描述符。 –

+0

你在Linux上測試過嗎?我有* 2 *在'項lsof的-n'輸出 –

回答

3

POSIX要求,即使是收盤後有來mmap'ed文件的引用。

mmap()函數應該爲與文件描述符fildes相關聯的文件添加一個額外的引用,該文件不會被該文件描述符上的後續close()移除。當沒有更多映射到文件時,該引用將被刪除。

這就是lsof看到有一個該文件的引用。所以它按照記錄工作。

+0

我的過程中掛載點實際打開的所有文件,繪製它們,然後關閉它們。因此,在關閉文件而不先取消映射時,我會收到「系統中打開的文件太多」消息。所以現在我明白,這是預期..但如果我嘗試根據文件描述符關閉後取消映射,它應該如何工作? – Zohar81

+1

@ Zohar81:open()遞增文件的引用計數。 mmap()也是(現在有兩個refences); close()遞減它(現在:1)。在munmap()之後,計數將降至零。 – wildplasser

+0

您可以嘗試在系統上增加限制(https://superuser.com/a/443168)。你顯然不想有太多的映射文件或打開文件描述符。關閉文件不直接鏈接到解映射相同的文件。在mmap中可以立即關閉。然後在需要時進行munmap。 – usr