1

remove对于函数的行为,C99 标准的措辞似乎有点模棱两可。

第 7.19.4.1 节第 2 段中:

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

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

4

4 回答 4

1

我认为 C 标准不能保证你有任何东西,它说 (N1570, 7.21.4.1 2):

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

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

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

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

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

POSIX 文档unlink()非常清楚:

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 Edition”是“IEEE Std 1003.1-2001 with corrigenda”。“IEEE Std 1003.1 2013 Edition”是“IEEE Std 1003.1-2008 并包含更正”。

于 2013-08-08T04:28:41.440 回答
1

C99 标准不保证任何东西。

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

有关可能出错的示例,请参阅 http://linux.die.net/man/2/unlink 。

于 2013-08-07T16:37:49.810 回答
1

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

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

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

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

于 2013-08-07T16:36:40.887 回答