来自 fsync(2):
fsync() transfers ("flushes") all modified in-core data of (i.e., modified
buffer cache pages for) the file referred to by the file descriptor fd to
the disk device (or other permanent storage device)
如果fd是通过shm_open(3p)或 `memfd_create(2)*等内存 API 之一获得的, fsync 会产生什么影响?是否有必要明确提交对内存对象的更改?
没有效果。它与永久存储无关。
从历史上看,混合 mmap() 和 read()/write() 可能会产生不一致的结果。
现代 Linux 的结构非常仔细,以使其在每个受支持的 CPU 上都能正常工作。尽管如果您的系统太晦涩难懂,您仍然可能是发现硬件特定错误的不幸者。
关键是,在符合 POSIX 的操作系统上,如果您希望 read() 之后能够始终如一地工作,则可能需要在将更改写入文件的内存映射后使用msync()进行刷新。如果您想了解 POSIX 规则,查看 msync() 的 MS_INVALIDATE 标志以及它的存在意味着什么可能会有所帮助:)。
但是,POSIX msync() 专门针对与持久存储相关联的映射。未定义它对“共享内存对象”的影响。因此,这将是回答您原始问题的一种非常晦涩的方式。
还要记住,仅仅因为某些东西实现了与 POSIX 同名的系统调用,它并不一定提供与 POSIX 相同的保证。只有少数操作系统版本实际上已提交给 POSIX 测试套件。(它要花钱)。