在什么情况下同一文件的物理内存备份mmap在linux进程之间共享?
我明白,必要条件是MAP_SHARED
。我明白,如果进程使用相同的文件描述符(例如,子进程从父进程继承它),内存将被共享。
但是如果,例如,
- 每个进程自己打开文件?
- 一个打开读,另一个打开写?
- 一个进程
mmap
是PROT_READ
文件,另一个进程PROT_WRITE
文件?
参见mmap()
的Linux手册页的这一部分:
MAP_SHARED
共享此映射。映射的更新对于映射同一区域的其他进程是可见的,并且(在文件支持的映射的情况下)被传递到底层文件。
回答您的具体问题:
- 无论进程是否分叉并使用相同的文件描述符,还是独立打开相同的文件(甚至通过不同的路径名)都无关紧要。所有的问题是它们映射了相同的文件,由文件系统上的inode决定,然后调用
mmap(MAP_SHARED)
。 - 文件描述符的
O_RDWR
模式控制是否允许该进程通过PROT_WRITE
,否则该进程的mmap()
调用将失败EACCESS
,(来自同一手册页):
错误:
EACCES
文件映射被请求,但fd未打开读取。日志含义请求了MAP_SHARED,并且设置了PROT_WRITE,但是fd没有以读写(O_RDWR)模式打开。或者设置了PROT_WRITE,但是文件只能追加。
PROT_READ
/PROT_WRITE
标志控制在调用mmap()
的相应进程中创建的虚拟页表项的可读/可写性(从而控制该进程的读写能力)。这对映射相同文件页面的其他进程没有影响(基于标志的读写访问可能不同于它们自己的mmap
调用)。
带有附加信息和一些有用示例的权威页面:
- IBM的mmap文档
- mmap的GNU libc文档
- linuxhint.com博客文章