当两个进程写入mmaped文件的相同部分时会发生什么?

时间:2013-12-28 05:41:23

标签: c linux posix mmap

我正在编写一个使用mmap系统调用的C程序,在Linux 3.12 64位上运行。

如果我有两个进程mmaping具有读/写访问权限的磁盘文件的同一区域,然后同时修改两个进程的区域内容......

  • 一个进程是否可以在msync之前或之后查看(读取)其他进程所做的更改数据?
  • 如果其他进程可以看到更新 - Linux mmap实现是否有事先保证?

1 个答案:

答案 0 :(得分:6)

是的,这是内存映射的目的之一:作为“瞬时IPC”的一种形式。

您必须设置MAP_SHARED标志:

如果您希望为此目的使用共享内存,我会考虑使用shminit()/ shmat()API:

建议:查看Beej的* nix进程间通信指南:

不,如果您使用原始mmap()API,则没有“之前/之后的保证”,如果您希望同时读取/写入数据,则必须使用某种锁定(例如信号量)。

此外,来自Understanding Memory Mapping

  

mmap和shmat服务都提供了多个功能   映射对象的相同区域以便它们共享的过程   对该对象的可寻址性。但是,mmap子例程会扩展   超出shmat子程序所提供的能力   允许相对无限数量的此类映射   成立。虽然这种能力增加了映射的数量   支持每个文件对象或内存段,它可以证明是低效的   用于许多进程将相同文件数据映射到的应用程序   他们的地址空间。

     

mmap子例程为每个进程提供唯一的对象地址   映射到对象。该软件通过提供来实现这一点   每个进程都有一个唯一的虚拟地址,称为别名。该   shmat子例程允许进程共享映射的地址   对象。

以上适用于任何* nix变体,包括Linux和AIX。