在使用mmap之后,我需要保持文件处于打开状态吗?

80

我有一个程序需要将许多(100个)大小为10-100MB的文件进行映射。我需要同时将它们全部映射。

目前,我在程序开始时调用open,然后是mmap,在程序结束时是munmapclose

通常情况下,在运行程序之前,我必须通过运行ulimit -n来调整打开文件的限制。

问题是我是否需要保持打开文件,或者我可以open mmap close 进行一些大数据处理,然后在完成后再进行munmap

mmap的手册对此似乎并不十分清楚。


你可以在系统调用跟踪(例如strace)可执行文件时看到,共享库的映射遵循以下模式:打开描述符,映射它,关闭描述符。 - Kaz
1个回答

87

不,至少在Linux上关闭文件是没问题的。

手册页面清楚地说明:

另一方面,关闭文件描述符并不会取消映射区域。

为了可移植性,我还查阅了POSIX手册,它也说了同样的事情(虽然更加清晰):

mmap() 函数向与文件描述符 fildes 关联的文件添加了一个额外的引用,该引用不会在该文件描述符的后续 close() 中被删除。这个引用会在没有更多的映射到该文件时被删除。


5
为什么proc/<pid>/fd没有关于内存映射文件的信息?是因为mmap是系统调用,所以这些文件描述符在内核的数据结构中?代朋友询问 - Paschalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接