我想在GNU C中创建一个类似于copy的写入接口来访问mmap()
ed文件。以下是它的工作方式:
mmap()
将文件映射到地址空间。这样做,我将指向一个包含真实数据的连续内存区域。mmap()
ed区域内存的任何物理页面。这是一个问题:最好的方法是什么?
答案 0 :(得分:2)
仍然不完全清楚您的确切要求。但是我看到了一些选项。
让mmap使用MAP_PRIVATE为您处理COW。然后,当您准备好同步时,只需创建一个常规mmap(或直接打开文件)到原始文件,然后与修改后的MAP_PRIVATE页面同步。
这并不能让您知道MAP_PRIVATE页面是否实际被修改过。如果你想要那样(例如,为了你可以优化而不进行同步,除非页面已经改变),那么你可以只读取MAP_PRIVATE页面。首次访问时,将发生SEGV。使用信号处理程序捕获SEGV并将MAP_PRIVATE页面重新映射为可写入,并在内部将其标记为脏。
最后,如果您不想使用MAP_PRIVATE并希望完全复制控制,请不要使用MMAP_PRIVATE,而是执行只读映射和信号处理程序。在信号处理程序中,分配一些内存,复制原始页面并重新映射错误页面。
希望一切都有意义。