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

2 c linux posix mmap

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

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

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

Fog*_*Day 6

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

您必须设置MAP_SHARED标志:

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

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

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

另外,从了解内存映射:

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

mmap子例程为映射到对象的每个进程提供唯一的对象地址.该软件通过为每个进程提供唯一的虚拟地址(称为别名)来实现此目的.shmat子例程允许进程共享映射对象的地址.

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