【问题标题】:How is a memory mapped file synchronized with another process writing to file?内存映射文件如何与另一个写入文件的进程同步?
【发布时间】:2015-07-16 15:11:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 可能。但我想对内存映射文件如何与文件 io 交互以及内核在幕后做了什么进行补充说明。另请注意,在另一个问题中,有问题的线程都使用内存映射文件。在这种情况下,只有一侧是。

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


【解决方案1】:

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

【讨论】:

  • 编写器是我无法控制的过程。我相信它使用的是标准文件 io.我正在尝试使用我自己的流程观看它。鉴于此,您的答案是否仍然有效?
  • “我相信它使用的是标准文件 io”是什么意思?您可以使用strace(注意writemsync)验证执行该过程的系统调用类型。
  • 我没有看到其中任何一个。那么它必须使用内存映射io。
  • 那么在这种情况下恐怕你不能使用inotify。如手册页所述:“inotify API 不会报告由于 mmap(2)、msync(2) 和 munmap(2) 而可能发生的文件访问和修改。”。您可能会使用更复杂的解决方案,尝试将线程注入进程并捕获对内存空间的所有内存访问,但这可能很难做到并且会降低性能。
  • 在未来的某个时间点,虽然必须与硬盘进行一些同步。我想它会在内核 IO 调度程序的控制之下?
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2012-10-11
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多