remove
对于函数的行为,C99 标准的措辞似乎有点模棱两可。
在第 7.19.4.1 节第 2 段中:
该
remove
函数导致名称为指向的字符串的文件filename
不再可以通过该名称访问。随后尝试使用该名称打开该文件将失败,除非它是重新创建的。
C99 标准是否保证该remove
函数将删除文件系统上的文件,或者实现是否可以简单地忽略该文件 - 将文件留在文件系统上,但当前程序无法通过该文件名访问 - 对于程序的其余部分?
remove
对于函数的行为,C99 标准的措辞似乎有点模棱两可。
在第 7.19.4.1 节第 2 段中:
该
remove
函数导致名称为指向的字符串的文件filename
不再可以通过该名称访问。随后尝试使用该名称打开该文件将失败,除非它是重新创建的。
C99 标准是否保证该remove
函数将删除文件系统上的文件,或者实现是否可以简单地忽略该文件 - 将文件留在文件系统上,但当前程序无法通过该文件名访问 - 对于程序的其余部分?
我认为 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 并包含更正”。
C99 标准不保证任何东西。
unlink(2)
由于任何可能失败的原因,该文件可能会保留在那里。例如,您无权执行此操作。
有关可能出错的示例,请参阅 http://linux.die.net/man/2/unlink 。
在 Unix / Linux 上,文件不被删除有几个原因:
remove()
当然会返回 ERROR)open()
就无法访问该文件(或者适当的调用将创建一个新文件),但只要任何进程保持文件打开,文件本身就会保留在磁盘上。通常,这只会从文件系统中取消链接文件。这意味着文件中的所有数据仍然存在。如果有足够的经验或时间,有人将能够取回这些数据。
有一些选项可以让文件不再被读取。*nix 实用程序 shred 将执行此操作。如果您希望从程序中执行此操作,请打开要写入的文件,并在您要“删除”的内容上写入无意义的数据。