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

C++ 内存映射文件如何与另一个写入文件的进程同步?,c++,linux,file-io,shared-memory,C++,Linux,File Io,Shared Memory,我基本上是在读进程中使用内存映射文件来“跟踪”一个文件,而写进程在某个时间间隔向其添加数据(使用stdio) 我的问题是,内存映射文件和编写器之间的同步在幕后是如何工作的?我需要任何额外的同步机制吗 我可以使用inotify来确定文件何时被修改,但我不确定内存映射文件是否也保证被更新 我将Linux ubuntu与gcc 4.8.2一起使用。如果您正在写入内存映射文件,在以下情况下,该文件将备份到磁盘(我假设您使用MAP\u SHARED映射文件): 使用msync(请参阅) 当内存页调出时:系

我基本上是在读进程中使用内存映射文件来“跟踪”一个文件,而写进程在某个时间间隔向其添加数据(使用stdio)

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

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


我将Linux ubuntu与gcc 4.8.2一起使用。

如果您正在写入内存映射文件,在以下情况下,该文件将备份到磁盘(我假设您使用
MAP\u SHARED
映射文件):

  • 使用
    msync
    (请参阅)
  • 当内存页调出时:系统需要内存,如果内存页是文件,它将保存到原始位置
  • 当您
    munmap
    (请参阅

  • 在这两种情况下,您都应该使用
    msync
    将数据刷新到磁盘,并通知任何在该文件上观看的程序。

    可能的重复。但我想补充说明内存映射文件如何与文件io交互以及内核在幕后做什么。另外请注意,在另一个问题中,q中的线程uestion都使用内存映射文件。在这种情况下,只有一面是。写入程序是一个我无法控制的进程。我相信它使用的是标准文件io。我正在尝试使用我自己的进程来观察它。考虑到这一点,你的答案仍然有效吗?你说的“我相信它使用的是标准文件io”是什么意思?您可以使用
    strace
    (注意
    write
    msync
    )验证进程中执行的系统调用类型。我看不到这两个。它一定是使用了内存映射io。那么在这种情况下,恐怕您不能使用
    inotify
    。如手册页中所述:“inotify API不会报告由于mmap(2)、msync(2)和munmap(2)而可能发生的文件访问和修改。”。您可能会使用更复杂的解决方案,尝试向进程中注入线程并捕获对内存空间的所有内存访问,但这可能很难做到,并会降低性能。在将来的某个时候,虽然必须与硬盘进行一些同步。我想它将在内核IO调度程序的控制下?