【问题标题】:How to ensure that when my process is operating on a file, no other process tries to write to it or delete it?如何确保当我的进程对文件进行操作时,没有其他进程尝试写入或删除它?
【发布时间】:2010-10-08 12:37:50
【问题描述】:

如果我的进程试图从文件中读取,那么我如何从我的代码(C 语言)中确保没有其他进程写入或删除它(包括用于删除文件的系统命令)?

此外,这是否可以在所有操作系统(Windows、Linux、Solaris、HP-UX、VxWorks 等)上实现?

【问题讨论】:

  • 据我所知,它将完全依赖于操作系统,但我已经在 C 语言中脱离了 15 年。
  • 哦,如果您在谷歌上搜索答案,术语是“文件锁定”。
  • 吹毛求疵的技术性:您不关心另一个进程是否尝试写入或尝试删除它 - 您只关心另一个进程是否成功。你真的无法阻止进程尝试。你也许可以阻止他们成功。
  • @Jonathan,是的。我的意思是一样的,我没有另一个成功的过程。
  • 另外,如果文件消失了,你会怎么做?例如。它在一个 U 盘上,有人刚刚把它拔了出来。您可以停止系统命令,但停止人员更难。

标签: c file file-locking


【解决方案1】:

编辑:我会为 Unix/Linux 回答问题

正如 gspr 和其他人所说,看看使用 fcntlflock 等的文件锁定。但是,请注意这些是 ADVISORY LOCKING 方法。

这是什么意思?这意味着您可以警告其他进程您当前正在访问文件或文件的一部分,但您不能强制阻止它们忽略您并在您的文件中写入所有内容

没有强制锁定原语。您可以使用权限来发挥自己的优势,但您永远无法获得完全的保证——root 用户始终可以覆盖您的限制。我认为没有办法解决这个问题。

【讨论】:

    【解决方案2】:

    对于 POSIX 系统,请查看 fcntlflock 也可能很有趣,尽管我不认为它是 POSIX 的一部分。

    【讨论】:

      【解决方案3】:

      您必须以 READ 共享权限打开文件,这意味着其他任何人试图打开它只能获得读取权限。正如@Pointy 所说,这是特定于操作系统的,您可能必须为 Windows、Linux 等单独编写代码。但是,大多数现代操作系统应该支持这一点。

      【讨论】:

        【解决方案4】:

        复制文件,进行更改,然后将其重命名为原始文件。

        如果文件尚不存在,另一种方法是使用独占标志创建文件,然后将其从文件系统中删除。执行您的写作,然后将其硬链接回文件系统(它目前仅作为打开的 inode 存在)。您可以使用/proc 作为源路径。

        【讨论】:

        • 在 Linux 上,O_TMPFILE 可用于在意外崩溃时避免文件系统混乱,但仍允许将其 linkated 回文件系统。
        猜你喜欢
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多