将输入文件映射到内存中,然后直接从映射的内存页解析数据,是从文件中读取数据的一种便捷且高效的方法。
但是,除非您能确保没有其他进程对映射文件进行写操作,否则这种做法似乎基本上是不安全的,因为即使在私有只读映射中的数据也可能会因为底层文件被另一个进程写入而发生更改。(例如 POSIX 未指定“建立MAP_PRIVATE映射之后对底层对象所做的修改是否通过MAP_PRIVATE映射可见”)
如果你想让你的代码在映射文件发生外部更改的情况下变得安全,那么你必须只通过volatile指针访问映射内存,然后极其小心地读取和验证输入,这似乎对于许多用例来说是不切实际的。
这个分析正确吗?关于内存映射API的文档通常只是顺带提到这个问题,如果有的话,所以我想知道是否遗漏了什么。
MAP_PRIVATE
的目的。它并不意味着“给我一个私有副本”,而是意味着“由我进行的修改对我私有”。它具有与访问文件的任何其他方法相同的并发问题。 - Anya ShenanigansMAP_PRIVATE
意味着“给我一个私有副本”?实际上,我引用了规范中说明相反的部分。不过,如果有一个选项确实可以确保一旦访问了映射页面,其他进程就不能更改它们,那就太好了。 - Stephan TolksdorfFILE_SHARE_READ
,这样其他进程在您使用文件时就无法修改它。 - Harry Johnston