83

I have a program that maps quite a few (100's) of sizable files 10-100MB each. I need them all mapped at the same time.

At the moment I am calling open followed by mmap at the beginning of the program, followed by munmap and close at the end.

Often I have to adjust the open files limit running ulimit -n before running the program.

Question is do I actually need to keep the files open, or can I open mmap close do some large data processing then munmap when I'm finished.

The man pages of mmap do not seem terribly clear to me on this one.

1
  • You can see it in a system call trace (e.g. strace) of an executable, that the mappings for shared libraries follow the pattern: open the descriptor, mmap it, close the descriptor.
    – Kaz
    Commented Aug 23, 2021 at 20:20

1 Answer 1

90

No, at least not on Linux it's fine to close the file.

The manual page clearly states:

On the other hand, closing the file descriptor does not unmap the region.

For portability, I also checked the POSIX manual, it says the same thing (although even more clearly):

The mmap() function adds 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 is removed when there are no more mappings to the file.

1
  • 6
    why proc/<pid>/fd does not contain information on the mmapped files? Is it because mmap is a syscall, so these fds are on kernel's data structures? asking for a friend
    – Paschalis
    Commented Jan 20, 2017 at 1:24

Not the answer you're looking for? Browse other questions tagged or ask your own question.