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

lnlaulya  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(313)

bounty将在6天后过期。回答此问题可获得+50的声望奖励。Samuel Hapak正在寻找来自知名来源的答案

在什么情况下,同一文件的物理内存支持mmap在linux中的进程之间共享?
我明白,必要条件是MAP_SHARED。我明白,如果进程使用相同的文件描述符(例如,子进程从父进程继承它),内存将被共享。
但是如果发生了什么,例如,

  • 每个进程都自己打开文件吗?
  • 一个打开用于读取,另一个打开用于写入?
  • 一个进程mmap使用PROT_READ处理文件,另一个进程使用PROT_WRITE处理文件?
qcbq4gxm

qcbq4gxm1#

有关mmap()的信息,请参见Linux手册页的以下部分:
Map共享
共享此Map。对Map的更新对Map同一区域的其他进程可见,并且(在文件备份Map的情况下)会一直传递到基础文件。
要回答您的具体问题:
1.进程是否分叉并使用相同的文件描述符,或者独立打开相同的文件(甚至通过不同的路径名)并不重要,重要的是它们Map了相同的文件(由文件系统上的inode确定),然后调用mmap(MAP_SHARED)
1.文件描述符的O_RDWR模式控制是否允许该进程传递PROT_WRITE,否则来自该进程的mmap()调用将失败,并返回EACCESS(来自同一手册页):
错误数:
每次
已请求文件Map,但fd未打开以进行阅读。已请求MAP_SHARED并设置了PROT_WRITE,但fd未在读/写(O_RDWR)模式下打开。或者已设置PROT_WRITE,但该文件是仅附加的。

  1. PROT_READ/PROT_WRITE标志控制在进行mmap()调用的相应进程中创建的虚拟页表项的可读写性(以及该进程的读写能力)。这对Map相同文件页的其他进程(这些进程可能根据其自身mmap调用的标志而在读/写访问上有所不同)没有影响。

相关问题