可以取消链接为读取和写入而打开的文件

时间:2013-10-18 04:53:15

标签: c linux macos unix

在我的程序中(在Mac OS X上),我使用以下代码打开文件。

 int fd;
 fd = open(filename, O_RDWR);

删除文件的程序如下:

unlink(filename);

在我的情况下,我有相同的文件被打开和删除。我观察到以下内容:

  1. 打开文件后,我可以使用此程序删除它,甚至可以使用rm命令删除它。
  2. 删除文件后,读取和写入操作正在处理文件,没有任何问题。
  3. 我想知道这背后的原因。如何阻止rm命令或unlink(2)系统调用删除正在打开的文件?

4 个答案:

答案 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()将此关联中的一个删除到文件中。如果删除文件的最后一个链接,则只能使您无法通过名称访问该文件。 ,这并不意味着该文件无法使用,因为文件可能已被打开并且当前由某个应用程序读取/写入。

当且仅当: - 没有链接 - 它目前没有被任何应用程序打开