bounty将在6天后过期。回答此问题可获得+50的声望奖励。Samuel Hapak正在寻找来自知名来源的答案。
在什么情况下,同一文件的物理内存支持mmap在linux中的进程之间共享?
我明白,必要条件是MAP_SHARED
。我明白,如果进程使用相同的文件描述符(例如,子进程从父进程继承它),内存将被共享。
但是如果发生了什么,例如,
- 每个进程都自己打开文件吗?
- 一个打开用于读取,另一个打开用于写入?
- 一个进程
mmap
使用PROT_READ
处理文件,另一个进程使用PROT_WRITE
处理文件?
1条答案
按热度按时间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,但该文件是仅附加的。
PROT_READ
/PROT_WRITE
标志控制在进行mmap()
调用的相应进程中创建的虚拟页表项的可读写性(以及该进程的读写能力)。这对Map相同文件页的其他进程(这些进程可能根据其自身mmap
调用的标志而在读/写访问上有所不同)没有影响。