【问题标题】:What happens if someone overwrites a file after I open it?如果有人在我打开文件后覆盖了它会发生什么?
【发布时间】:2020-04-29 13:54:00
【问题描述】:

当我在 C 中打开一个文件时,我得到一个文件描述符,如果我没有读取它的内容,然后有人修改了文件,我会读取旧文件还是新文件? 假设一个文件有很多行,在读取文件时会发生什么情况,有人编辑了开头,这会以某种方式破坏我的文件读取文件的方式吗?

如何在读取文件时不损坏程序?操作系统可以解决这个问题吗?如果我仍然可以读取旧数据,这些数据存储在哪里?

open 的手册页,有一些关于 open 内部的信息,但我不是很清楚。

【问题讨论】:

  • 打开的时候肯定删除不成功。
  • @ItachiUchiwa 在 Posix 中,它可能会被删除,但打开的文件仍然存在用于打开它的进程。它刚刚从目录中删除。
  • C 标准库没有文件共享的概念,也没有定义第二次打开同一个文件时应该发生什么。行为取决于实现。
  • 在 Windows 中,可以删除打开的文件。

标签: c++ c file


【解决方案1】:

所有这些都很大程度上取决于操作系统,而不是 C++ 级别。例如,在 Windows 中,使用 CreateFile 打开文件允许您锁定文件以供后续访问。但不是在语言层面。

您必须根据您使用的特定操作系统做出决定。没有个假设;这一切都取决于您提供的文档。

通常,C++ 级别的文档在此类问题上没有多大用处,因为对于像文件访问这样低级别的东西永远不可能有一个完整的标准(即使 fs 是最近才添加到 C++ 中的),并且没有必要创建“便携式” ' 上的代码。您必须养成沉浸在操作系统特定文档和库中的习惯。

【讨论】:

    【解决方案2】:

    C 语言标准不承认其他进程的存在,也不指定它们与程序之间的交互(C++ 也没有)。行为取决于操作系统和/或文件系统。

    通常,最安全的做法是假设文件操作不是原子操作,因此在另一个进程正在编辑文件时访问文件将是竞争条件的一个示例。有些系统可能会提供一些更严格的保证。

    尝试避免问题的一般方法是文件锁定。标准 C 库没有用于文件锁定的 API,但多任务操作系统通常有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多