我试图了解当mmap
系统调用已映射到内存的文件随后被其他进程写入时会发生什么。
我在“进程A”中对mmap
内存进行了保护。PROT_READ
如果我关闭进程 A 中的底层文件描述符,然后另一个进程写入该文件(不使用mmap
; 只是将 stdout 简单重定向到>
shell 中使用的文件),mmap
进程 A 的地址空间中的 ed 内存是否受影响? 鉴于这些页面是只读的,我希望它们不会改变。但是,在尝试解析映射的内存时,SIGBUS
由于无效的内存访问 ( ) ,进程 A 被信号终止。Non-existent physical address at address 0x[...]
我怀疑这是由其他进程写入支持文件引起的。设置MAP_PRIVATE
是否足以完全保护此内存免受其他进程的影响?
关闭文件描述符根本不会改变任何东西
可能是。的联机帮助页
mmap(2)
说:在实践中,其他进程所做的更改似乎反映在 mmaped 区域的内容中,至少对于常规文件而言。
我希望在您截断 mmaped 文件时会发生这种情况。
不,
MAP_PRIVATE
只防止对内存的修改被传递到支持文件,而不是相反。