【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 2020-07-18
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多