内存映射文件不能在没有取消映射的情况下关闭,因为它仍然被引用
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
看到的那个文件的引用。所以它按照记录工作。
我在 macOS 中遇到无法关闭内存映射文件的情况
首先取消映射(使用 munmap 系统调用),虽然关闭系统调用 return 成功结果(=0)我仍然可以在 lsof -n
中看到文件记录。
在 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
看到的那个文件的引用。所以它按照记录工作。