系统如何知道文件何时被修改?特别是内存映射文件

系统如何知道文件何时被修改?特别是内存映射文件

如果我从进程外部查看进程,我如何知道它修改了哪些文件?

我能做的一件事是跟踪写入调用,但进程可以将文件映射到内存并写入内存修改文件。

内核需要跟踪有两个原因。它需要知道调用同步时要刷新什么,并且需要更新文件的 mtime。

那么系统是如何知道的呢?

除了 write 和 mmap 之外还有其他方法可以修改文件吗?

答案1

内核知道哪些页面被修改,就像修改任何其他页面一样:写入时,页表中的一个标志被设置为将其标记为“脏”。这可以由 CPU 或 MMU 完成,也可以在它们的帮助下完成(例如,它们可以直接设置该位,或者引发中断让软件执行此操作)。

但实际上,您假设的行为并不能得到保证。更改的页面无需写回(甚至无需排队等待写回),直到调用msync或。munmap

我不确定还有多少种其他方法来修改文件,但至少有几种:

  1. truncate/ftruncate
  2. writev, pwritev, aio_write( 的变体write
  3. 将其用作交换文件、环回设备(例如/dev/loop0)的后备设备等。
  4. 可能存在ioctl会更改文件内容的调用。更糟糕的是,这些可能是特定于文件系统的。

相关内容