在我的程序中(在Mac OS X上),我使用以下代码打开文件。
int fd;
fd = open(filename, O_RDWR);
删除文件的程序如下:
unlink(filename);
在我的情况下,我有相同的文件被打开和删除。我观察到以下内容:
rm
命令删除它。我想知道这背后的原因。如何阻止rm
命令或unlink(2)
系统调用删除正在打开的文件?
答案 0 :(得分:7)
您无法阻止unlink(2)
取消链接有权取消链接的文件(即它具有对该目录的写入权限)。
unlink
未被称为unlink
,因为没有人能想到更好的名字。它被称之为因为它就是它所做的;它取消了文件与目录的链接。 (目录只是链接的集合;即它将名称与相应数据的位置相关联。)它不会删除文件;当文件系统不再有任何链接时,该文件被文件系统垃圾收集。
打开文件描述符不是保持文件链接的唯一方法。另一种非常常见的方法是使用link(1)
命令而不使用-s
选项。这会创建“硬”链接。如果一个文件有多个硬链接,那么删除其中一个链接(使用unlink(2)
)就可以了 - 它会删除其中一个链接。
rm
命令可能更令人困惑,但它也只删除了名称,而不是文件。只要有人有链接,该文件就存在,包括正在运行的进程。
答案 1 :(得分:3)
首先,rm
命令正在调用unlink(2)
然后,在Linux或其他Unix(例如MacOSX)上取消链接打开的文件是正常的事情。这是获取临时文件的规范方法(如tmpfile(3)可能会这样做)。
您应该了解inodes是什么,并意识到文件不是其名称或文件路径,而是基本上是inode。一个文件可以有零个,一个或多个文件路径或名称(如果所有名称都位于同一文件系统中,则可以使用link(2)系统调用添加更多文件路径或名称。目录条目将名称与inode相关联。
因此没有(POSIX-ly便携式)方式禁止在没有任何名称的开放文件上进行I / O. 对于某些打开的文件,内核具有其inode的引用计数器,并保留该inode,直到所有进程open(2) - 它已close(2)它已终止。
答案 2 :(得分:1)
这是UNIX SYSTEM中的正常情况。当您删除或取消链接打开的文件时。 UNIX系统只标记一个标志,并不会真正删除文件的欺骗。直到文件关闭。它将在文件系统中被删除。
帮助守护进程正常工作是保护。
答案 3 :(得分:1)
链接是与某个文件关联的名称(文件基本上是未命名的)。请注意,文件可以有不同的名称(尝试ln
)。
unlink()
将此关联中的一个删除到文件中。如果删除文件的最后一个链接,则只能使您无法通过名称访问该文件。 但,这并不意味着该文件无法使用,因为文件可能已被打开并且当前由某个应用程序读取/写入。
当且仅当: - 没有链接 - 它目前没有被任何应用程序打开