我有一个固定大小的文件。该文件已被ftruncate()编辑为size = N * getpagesize()。该文件具有固定大小的记录。我有一个编写过程,它通过mmap(... MAP_SHARED ...)映射整个文件,并随机修改记录(像数组一样访问)。我有一个读者进程也可以做mmap(... MAP_SHARED ......)。现在,由于编写器进程写入随机记录,读取器进程需要确定哪个页面在其映射中已更改。有没有办法在用户空间中做到这一点?我在Linux上 - x86_64。欢迎平台特定代码/黑客。谢谢你的时间。
编辑:我没有自由修改编写进程的代码,以某种方式向我提供修改记录的指示。
答案 0 :(得分:4)
相关文件:
https://www.kernel.org/doc/Documentation/vm/pagemap.txt
/proc/*/pagemap
中找到该位置/proc/kpageflags
,并寻找PFN,读取8个字节DIRTY
标志,则页面变脏(换句话说,作者已写入该页面)答案 1 :(得分:2)
这将是非常非常难看的。最有可能的是,这不值得尝试这样做,你最好把改变你的任何东西改成这个角落。
您可以使用受锁保护的共享位图。作者保护每个页面。如果它写入受保护的页面,则会出错。您必须捕获故障,取消保护页面,锁定位图,并在位图中设置与该位对应的位。这将告诉读者该页面已被修改。
读者操作如下(这是痛苦的部分):
锁定位图。
制作已修改页面的列表。
将修改过的页面列表传达给编写者。编写者必须再次保护这些页面并清除位图中的位。作者必须等待读者在开始阅读之前完成此操作,否则更改可能会丢失。
读者现在可以阅读修改后的页面。