mmap:其他进程对先前以只读方式映射的文件进行写入的影响

mmap:其他进程对先前以只读方式映射的文件进行写入的影响
https://dev59.com/unix/60bRa4cB1Zd3GeqP0nht

mmap
4
我正在尝试理解当一个文件被mmap系统调用映射到内存中后,其他进程对其进行写入时会发生什么。 在"进程A"中,我使用PROT_READ保护来mmap内存。如果我在进程A中关闭底层文件描述符,并且另一个进程稍后对该文件进行写入(不使用mmap,只是在shell中使用>将stdout重定向到文件),那么进程A的mmap内存是否会受到影响?鉴于这些页面是只读的,我希望它们不会改变。然而,当尝试解析映射内存时,进程A却因为无效的内存访问(地址0x[...]处不存在的物理地址)而被SIGBUS信号终止。我怀疑这是由其他进程对后备文件的写入引起的。设置MAP_PRIVATE是否足以完全保护这段内存免受其他进程的影响?
- user001
1看到内容发生变化还不够糟糕,更糟糕的是长度也发生了变化。这会导致你在读取被截断后面的区域时出现错误(而且截断可能发生在偏移量为0的位置)。 - eckes
1@eckes:谢谢,我认为这就是另一个进程截断了它映射的文件后,我的进程收到SIGBUS信号的源头。 - user001
1个回答
5
如果我在进程A中关闭底层文件描述符,关闭文件描述符不会改变任何东西。如果另一个进程稍后写入该文件(不使用mmap,只是在shell中使用>将stdout重定向到文件),进程A的内存映射是否受影响?可能受到影响。《mmap(2)》的手册页上有这样的说明:
 MAP_PRIVATE
    ...
    It is  unspecified  whether changes made to the file
    after the mmap() call are visible in the mapped region.
实际上,在实践中,其他进程所做的更改似乎会反映在mmaped区域的内容中,至少对于常规文件来说。 然而,在尝试解析映射内存时,进程A由于无效的内存访问(在地址0x[...]处不存在物理地址)而被SIGBUS信号终止。 我预计这种情况会发生在截断mmaped文件时。 将MAP_PRIVATE设置为何能完全保护此内存免受其他进程的影响吗? 不,MAP_PRIVATE仅防止对内存的修改传递到后备文件,而不能实现相反的效果。
- user313992
谢谢,那很有帮助。所以听起来 mmap 不是读取(并在内存中保存)一个文件的当前状态的正确工具,当该文件可能在内存被进程完全读取之前被其他进程修改时,这个进程创建了映射。 - user001
2Hurd似乎有一个MAP_COPY,但在Linux/BSD/Solaris等系统不支持。您可以在此处阅读更多信息:链接。 - user313992
@mosvy 现在同步需要手动完成吗? - anki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值