如何将记忆映射的文件与另一个进程写入文件同步

How is a memory mapped file synchronized with another process writing to file?

本文关键字:文件 进程 另一个 同步 记忆 映射      更新时间:2023-10-16

我本质上是在尝试在读取器进程中使用内存映射的文件在作者进程将数据附加到它(使用STDIO)的某个时间间隔时来"尾部"文件。

我的问题是,内存映射文件和作者之间的同步如何在幕后工作?我是否需要其他同步机制?

我可以使用Inotify来找出何时修改文件,但我不确定是否也保证了内存映射的文件也可以更新。

我正在使用Linux Ubuntu与GCC 4.8.2。

如果要写入内存映射文件,则在以下情况下将文件备份到磁盘(我假设您是用MAP_SHARED映射的文件):

  1. 使用msync(请参阅http://man7.org/linux/man-pages/man2/msync.2.html)
  2. 当内存页面交换时:系统需要内存,如果内存页是文件,则将其保存到原始位置。
  3. 当您munmap(请参阅http://man7.org/linux/man-pages/man2/munmap.2.html

无论哪种情况,您都应使用msync冲洗数据以磁盘并通知在文件上观看的任何程序。