【问题标题】:Is the remove function guaranteed to delete the file?删除功能是否保证删除文件?
【发布时间】:2013-08-09 03:32:05
【问题描述】:

关于remove 函数的行为,C99 标准的措辞似乎有点含糊。

第 7.19.4.1 节第 2 段:

remove函数导致文件名是filename所指向的字符串 不再可以通过该名称访问。随后尝试使用该文件打开该文件 name 将失败,除非重新创建它。

C99 标准是否保证 remove 函数将删除文件系统上的文件,或者实现是否可以简单地忽略该文件 -- 保留该文件文件系统,但当前程序无法通过该文件名访问 - 对于程序的其余部分?

【问题讨论】:

  • remove() 不打电话给unlink() 吗?如果是这种情况,则无法保证该文件已从磁盘中删除,因为可能有更多指向该文件的链接。如果它是最后一个链接,那么它将从磁盘中“删除”。该空间将可供重复使用。但它很可能仍会驻留在磁盘上,直到被覆盖。
  • 三个答案,没有一个能解决实际问题。问题是,“如果我打电话给remove(),它是否必须实际尝试实际删除此文件(是的,它可能会以多种方式失败),还是允许它简单地返回成功,然后不允许这个程序的这个实例再看那个文件吗?"

标签: c c99 language-lawyer standard-library


【解决方案1】:

通常,这只会取消文件与文件系统的链接。这意味着文件中的所有数据仍然存在。如果有足够的经验或时间,有人可以取回这些数据。

有一些选项可以避免再次读取文件。 *nix 实用程序 shred 将执行此操作。如果您希望在程序中执行此操作,请打开要写入的文件,并在您要“删除”的内容上写入无意义的数据。

【讨论】:

    【解决方案2】:

    C99 标准不做任何保证。

    由于unlink(2) 可能失败的任何原因,该文件可能会保留在那里。例如,您无权执行此操作。

    请咨询http://linux.die.net/man/2/unlink,了解可能出现的问题。

    【讨论】:

      【解决方案3】:

      在 Unix / Linux 上,文件不被删除有几个原因:

      1. 您没有文件目录的写权限(在这种情况下,remove() 当然会返回 ERROR)
      2. 文件上有另一个硬链接。然后该文件将保留在磁盘上,但只能由其他路径名访问
      3. 文件被任何进程保持打开状态。在这种情况下,目录条目会立即被删除,这样后续的open() 就不能访问该文件(或者适当的调用将创建一个新文件),但只要任何进程保持打开,文件本身就会保留在磁盘上。

      【讨论】:

        【解决方案4】:

        我认为 C 标准对您没有任何保证,该标准说 (N1570, 7.21.4.1 2):

        remove函数导致文件名是filename指向的字符串 不再可以通过该名称访问。随后尝试使用该文件打开该文件 name 将失败,除非它被重新创建。如果文件已打开,则删除的行为 函数是实现定义的。

        所以,如果你有一个病态的实现,我想它可以被解释为意味着调用 remove() 仅仅具有使该文件对该程序的这个正在运行的实例不可见的效果,但那将是,如我说,病态的。

        然而,一切都不是完全愚蠢的! remove() 的 POSIX 规范说,

        如果path没有命名目录,remove(path)应该等价于unlink(path)。

        如果路径命名一个目录,remove(path) 应该等同于 rmdir(path)。

        unlink() 的 POSIX 文档非常清楚:

        unlink() 函数将删除指向文件的链接。

        因此,除非您的实现 (a) 符合 POSIX 要求,并且 (b) 非常病态,否则您可以放心 remove() 函数实际上会尝试删除文件,并且仅当文件被实际删除时才会返回0

        当然,在当前使用的大多数文件系统中,文件名与实际文件是分离的,因此如果您有五个指向一个 inode 的链接,那么该文件将一直存在,直到您删除所有五个链接。

        参考资料:

        The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
        The Open Group Base Specifications Issue 7, IEEE Std 1003.1™, 2013 Edition
        注意:“IEEE Std 1003.1 2004 版”是“IEEE Std 1003.1-2001 与勘误合并”。 “IEEE Std 1003.1 2013 Edition”是“IEEE Std 1003.1-2008 并包含更正”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 2012-12-23
          • 1970-01-01
          • 2020-03-18
          • 2011-04-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多