没有取消映射就无法关闭内存映射文件,因为它仍然被引用

时间:2017-10-19 21:07:02

标签: c macos system-calls mmap

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

在linux中,根据mmap手册页明确提到closing the file doesn't unmap the file

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

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

谢谢

1 个答案:

答案 0 :(得分:3)

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

  

mmap()函数应添加对与文件描述符fildes相关联的文件的额外引用,该文件描述符fildes不会被该文件描述符上的后续close()删除。当没有更多映射文件时,应删除此引用。

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