我试图了解当已通过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
仅防止对内存的修改被传递到备份文件,而不是相反。