Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当两个进程写入mmaped文件的同一部分时会发生什么情况?_C_Linux_Posix_Mmap - Fatal编程技术网

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

C 当两个进程写入mmaped文件的同一部分时会发生什么情况?,c,linux,posix,mmap,C,Linux,Posix,Mmap,我正在编写一个C程序,它使用mmap系统调用,运行在Linux 3.12 64位上 如果有两个进程使用读/写访问权限对磁盘文件的同一区域进行MMA,然后同时修改两个进程中的区域内容 一个进程是否可以在msync之前或之后看到(读取)另一个进程更改的数据 如果另一个进程可以看到更新,那么Linux mmap实现是否会在更新之前做出保证 是的,这就是内存映射的目的之一:作为“瞬时IPC”的一种形式 您必须设置地图共享标志: 如果您希望使用共享内存来实现此目的,我将考虑SHMITIT()/SH

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

如果有两个进程使用读/写访问权限对磁盘文件的同一区域进行MMA,然后同时修改两个进程中的区域内容

  • 一个进程是否可以在msync之前或之后看到(读取)另一个进程更改的数据
  • 如果另一个进程可以看到更新,那么Linux mmap实现是否会在更新之前做出保证

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

    您必须设置地图共享标志:

    如果您希望使用共享内存来实现此目的,我将考虑SHMITIT()/SHIMA()API来代替:

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

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

    此外,来自:

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

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


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

    竞争条件和最终未定义的行为。您需要同步对内存映射文件的访问。