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

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

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

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

答案1

如果我关闭进程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.

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

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

我预计当您截断映射文件时会发生这种情况。

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

不,MAP_PRIVATE仅防止对内存的修改被传递到备份文件,而不是相反。

相关内容