假设文件被大量替换(同名)而不是就地修改(即创建一个临时文件,然后重命名为文件名)。
我想更改不会影响本地 mmap,因为内核仍然具有磁盘上旧文件(inode)的句柄。
但是,由于 NFS 是无状态的,在 mmap 的(长)生命周期中,mmap 是否会混淆并混淆旧/新文件内容?
在我看来 read/readv 是处理 NFS 挂载文件的唯一安全方法。
如果您有一个文件的开放引用,该引用将继续引用同一个文件,只要引用存在,即使文件本身被删除或重命名,即使它的名称在之后被全新的文件重用它被删除。引用可以是文件描述符或内存映射。这是 POSIX 的一部分,无论使用哪种类型的文件系统,它都是正确的(或者应该是!)。
换句话说:如果您在 NFS 文件系统上打开一个文件并将其映射到内存中,只要您不取消映射它,您就可以继续使用该内存映射,即使其他进程(或同一进程)删除该文件并将其替换为具有相同名称的新文件。
NFS 协议确实是无状态的,因此实现必须采取特殊步骤来确保正确处理这种情况。自从我查看它是如何完成的已经很长时间了,但是我最后一次这样做(在 Solaris 上)是通过将文件重命名为特殊的隐藏名称(.nfsXXXXX
)而不是在链接计数减少到零时删除它们而完成仍然有对它们的公开引用。无论如何,无论实现使用什么技巧,作为文件系统的用户,您都不应该担心它。