【问题标题】:Ensure a file is not changed while trying to remove it确保文件在尝试删除时未更改
【发布时间】:2010-07-15 17:38:46
【问题描述】:
在 POSIX 环境中,我想从磁盘中删除一个文件,但在删除它之前计算它的校验和,以确保它没有被更改。锁够了吗?我应该打开它,取消链接,计算校验和,然后关闭它(这样操作系统就可以删除它的 inode)吗?有什么方法可以确保没有其他进程在文件上有打开的文件描述符?
为了提供一些上下文,代码执行跨主机的文件同步,如果远程主机删除文件但文件正在本地更改,则可能会丢失数据。
【问题讨论】:
标签:
locking
posix
race-condition
filehandle
file-descriptor
【解决方案1】:
您的 open,unlink,checksum,close 建议不会按原样工作,因为如果校验和不匹配,您将被卡住(没有 POSIX 可移植的方法来创建指向由一个文件描述符)。更好的变体是重命名、校验和、取消链接、关闭,如果校验和不匹配,您可以撤消重命名或重做副本。如果第三个程序在此期间重新创建了文件,您仍然需要考虑要做什么。
POSIX 只提供合作锁。如果您可以控制可能修改文件的程序,请确保它们使用锁;如果这不是一个选项,你就会被困在没有锁的地方。
没有可移植的方法来查看哪些(甚至是否)进程打开了文件。在大多数 Unix 系统上,lsof 会显示给您,但这不是通用的、不可靠的(程序可以在 lsof 完成查找之后打开文件)和不完整的(如果文件通过 NFS 导出,可能会有无法了解活跃客户)。
您可能会受益于查看其他同步程序正在执行的操作,例如 rsync 和 unison。