2

在 POSIX 环境中,我想从磁盘中删除一个文件,但在删除它之前计算它的校验和,以确保它没有被更改。锁够了吗?我应该打开它,取消链接,计算校验和,然后关闭它(这样操作系统就可以删除它的 inode)吗?有什么方法可以确保没有其他进程在文件上有打开的文件描述符?

为了提供一些上下文,代码执行跨主机的文件同步,如果远程主机删除文件但文件正在本地更改,则有可能丢失数据。

4

1 回答 1

3

您的 open,unlink,checksum,close 建议不会按原样工作,因为如果校验和不匹配,您将被卡住(没有 POSIX 可移植的方法来创建文件描述符给出的文件的链接)。更好的变体是重命名、校验和、取消链接、关闭,如果校验和不匹配,您可以撤消重命名或重做副本。如果第三个程序在此期间重新创建了文件,您仍然需要考虑要做什么。

POSIX 只提供合作锁。如果您可以控制可能修改文件的程序,请确保它们使用锁;如果这不是一个选项,那么您将被卡在没有锁的情况下。

没有可移植的方法来查看哪些(甚至是否)进程打开了文件。在大多数 Unix 系统上,lsof会显示给您,但这不是通用的、不可靠的(程序可以在lsof完成查找后立即打开文件)和不完整的(如果文件是通过 NFS 导出的,可能无法知道活跃的客户)。

您可能会受益于查看其他同步程序正在做什么,例如 rsync 和 unison。

于 2010-07-15T19:51:37.453 回答