Linux: 如何防止文件支持的内存映射导致访问错误(SIGBUS 等)?

Linux: How to prevent a file backed memory mapping from causing access errors (SIGBUS etc.)?

我想为内存映射文件 io 编写一个包装器,它要么无法映射文件,要么 returns 一个在取消映射之前有效的映射。使用普通 mmap 时,如果底层文件在映射时被截断或删除,就会出现问题。根据 mmap 的 linux 手册页,如果在截断后访问超出文件新末尾的内存,则会收到 SIGBUS。无法捕获此信号并以这种方式处理错误。

我的想法是创建文件的副本并映射副本。在具有 Cow 功能的文件系统上,这会带来很小的开销。

但问题是:如何保护副本不被另一个进程操纵?临时文件不是真正的选择,因为理论上恶意进程仍然可以改变它。我知道 Linux 上有文件锁,但据我所知,它们要么是可选的,要么不会阻止其他人删除文件。

我要求两种答案:以坚如磐石的方式映射文件的方法或完全保护临时文件免受其他进程影响的机制。但也许我解决问题的整个方法是错误的,所以请随意提出激进的解决方案 ;)

您无法阻止熟练而坚定的用户故意搬起石头砸自己的脚。只需采取合理的预防措施,以免意外发生。

  • 大多数程序假定输入文件不会改变,这通常没问题
  • 想要处理与协作程序共享的文件的程序使用文件锁定
  • 需要私有文件的程序将创建一个临时文件、快照或其他——如果它们取消链接以进行自动清理,也无法通过 fs 访问它
  • 想要保护其数据免受所有常规用户操作影响的程序将 运行 作为专用系统帐户,在这种情况下 chmod 足以提供保护。

任何有权访问同一帐户(或 root)的人都可以通过简单的 kill -BUS、chmod/truncate 或任何更高级的手段(例如复制和修补二进制文件)来干扰该程序,克隆它的 FD,或者附加调试器。如果那是他们想做的,你无权阻止他们。