c++ - 内存映射文件如何与写入文件的另一个进程同步?

标签 c++ linux file-io shared-memory

我本质上是在尝试通过在读取进程中使用内存映射文件来“尾部”文件,而写入进程在某个时间间隔向它附加数据(使用 stdio)。

我的问题是内存映射文件和编写器之间的同步在幕后是如何工作的?我需要任何额外的同步机制吗?

我可以使用 inotify 来查明文件何时被修改,但我不确定内存映射文件是否也能保证得到更新。

我正在使用带有 gcc 4.8.2 的 Linux ubuntu。

最佳答案

如果您正在写入内存映射文件,则在以下情况下该文件将备份到磁盘(我假设您使用 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 将数据刷新到磁盘并通知所有监视该文件的程序。

关于c++ - 内存映射文件如何与写入文件的另一个进程同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077472/

相关文章:

linux - 我们如何在 Bash 中获得两个数组的并集?

java - 如何修复因扫描仪错误读取文件而导致的 InputMismatchException 错误?

c++ - 如何在 Visual Studio C++ 2010 中将 BSTR 转换为 std::string?

Python 多进程队列 get() block

c - 如何使用 C 阻止退格键出现在 nCurses 中?

optimization - 避免编写两次代码,同时保持正确的编码方式?

java - 复制目录和文件时需要有 JProgress 条来衡量进度

c++ - QProcess 没有完成创建文件

c++ - 在C++中向数组添加索引和指定数字

c++ - 在基类/派生类中调用 C++ 的纯虚函数