mmap:其他进程写入先前映射为只读文件的影响

use*_*001 5 c mmap

我试图了解当一个已被mmap系统调用映射到内存的文件随后被其他进程写入时会发生什么。

我在“进程A”中mmapPROT_READ保护内存。如果我关闭进程 A 中的底层文件描述符,然后另一个进程写入该文件(不使用mmap;只是将 stdout 简单重定向到>shell 中使用的文件),mmap进程 A 地址空间中的ed 内存是否受到影响? 鉴于这些页面是只读的,我希望它们不会改变。但是,当尝试解析映射的内存时,SIGBUS由于无效的内存访问 ( Non-existent physical address at address 0x[...]) ,进程 A 被信号终止。我怀疑这是由其他进程写入支持文件引起的。设置MAP_PRIVATE是否足以完全保护此内存免受其他进程的影响?

mos*_*svy 5

如果我关闭进程 A 中的底层文件描述符,

关闭文件描述符根本不会改变任何东西

另一个进程稍后写入该文件(不使用 mmap;只是在 shell 中使用 > 将 stdout 简单重定向到文件),进程 A 地址空间中的 mmaped 内存是否受到影响?

可能是。的手册页mmap(2)说:

 MAP_PRIVATE
    ...
    It is  unspecified  whether changes made to the file
    after the mmap() call are visible in the mapped region.
Run Code Online (Sandbox Code Playgroud)

实际上,其他进程所做的更改似乎反映在 mmaped 区域的内容中,至少对于常规文件。

但是,当尝试解析映射的内存时,由于无效的内存访问(地址 0x[...] 处不存在物理地址),进程 A 被 SIGBUS 信号终止。

我希望在您截断 mmaped 文件时会发生这种情况。

设置MAP_PRIVATE是否足以完全保护此内存免受其他进程的影响?

不,MAP_PRIVATE只能防止对内存的修改传递到后备文件,而不是相反。

  • hurd 似乎有一个“MAP_COPY”,但 Linux/BSD/Solaris/etc 不支持它。您可以在[此处](https://yarchive.net/comp/linux/map_copy.html)阅读更多相关信息。 (2认同)