内存映射文件不能在没有取消映射的情况下关闭,因为它仍然被引用

Memory mapped file cannot be closed without un-mapping, since it's still referenced

我在 macOS 中遇到无法关闭内存映射文件的情况 首先取消映射(使用 munmap 系统调用),虽然关闭系统调用 return 成功结果(=0)我仍然可以在 lsof -n 中看到文件记录。

根据 mmap 手册页,

在 linux 中明确提到 closing the file doesn't unmap the file

这两个操作系统之间的行为确实不同吗? 对这种不同的行为有什么解释吗?

编辑:阅读下面的评论后,我意识到平台之间没有不同的行为,我的文件仍然打开的原因是它仍然被 mmap 引用。

感谢

POSIX 要求即使在关闭后也有对 mmap 文件的引用。

The mmap() function shall add an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference shall be removed when there are no more mappings to the file.

这就是 lsof 看到的那个文件的引用。所以它按照记录工作。