linux上两个进程mmap同一个文件,什么时候共享内存?



在什么情况下同一文件的物理内存备份mmap在linux进程之间共享?

我明白,必要条件是MAP_SHARED。我明白,如果进程使用相同的文件描述符(例如,子进程从父进程继承它),内存将被共享。

但是如果,例如,

  • 每个进程自己打开文件?
  • 一个打开读,另一个打开写?
  • 一个进程mmapPROT_READ文件,另一个进程PROT_WRITE文件?

参见mmap()的Linux手册页的这一部分:

MAP_SHARED
共享此映射。映射的更新对于映射同一区域的其他进程是可见的,并且(在文件支持的映射的情况下)被传递到底层文件。

回答您的具体问题:

  1. 无论进程是否分叉并使用相同的文件描述符,还是独立打开相同的文件(甚至通过不同的路径名)都无关紧要。所有的问题是它们映射了相同的文件,由文件系统上的inode决定,然后调用mmap(MAP_SHARED)
  2. 文件描述符的O_RDWR模式控制是否允许该进程通过PROT_WRITE,否则该进程的mmap()调用将失败EACCESS,(来自同一手册页):

错误:
EACCES
文件映射被请求,但fd未打开读取。日志含义请求了MAP_SHARED,并且设置了PROT_WRITE,但是fd没有以读写(O_RDWR)模式打开。或者设置了PROT_WRITE,但是文件只能追加。

  1. PROT_READ/PROT_WRITE标志控制在调用mmap()的相应进程中创建的虚拟页表项的可读/可写性(从而控制该进程的读写能力)。这对映射相同文件页面的其他进程没有影响(基于标志的读写访问可能不同于它们自己的mmap调用)。

带有附加信息和一些有用示例的权威页面:

  1. IBM的mmap文档
  2. mmap的GNU libc文档
  3. linuxhint.com博客文章

最新更新