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

dop*_*ime 4 c unix linux macos

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

 int fd;
 fd = open(filename, O_RDWR);
Run Code Online (Sandbox Code Playgroud)

删除文件的程序如下:

unlink(filename);
Run Code Online (Sandbox Code Playgroud)

就我而言,我有相同的文件被打开和删除.我观察到以下情况:

  1. 打开文件后,我可以使用该程序删除它,甚至可以使用rm命令删除它.
  2. 删除文件后,读取和写入操作正在处理该文件没有任何问题.

我想知道这背后的原因.如何防止rm命令或unlink(2)系统调用删除正在打开的文件?

ric*_*ici 8

您无法停止unlink(2)取消链接有权取消链接的文件(即它具有对目录的写入权限).

unlinkunlink因为没有人能想到一个更好的名字而没有打电话.它被称之为因为它就是它所做的; 它取消了文件与目录的链接.(目录只是链接的集合;即它将名称与相应数据的位置相关联.)它不会删除文件; 当文件系统不再有任何链接时,文件将被文件系统垃圾收集.

打开文件描述符不是保持文件链接的唯一方法.另一种非常常见的方法是使用link(1)不带-s选项的命令.这会创建"硬"链接.如果一个文件有几个硬链接,那么删除其中一个链接(带unlink(2))就是这样 - 它删除了其中一个链接.

rm命令可能更令人困惑,但它也只删除了名称,而不是文件.只要有人有链接,该文件就存在,包括正在运行的进程.


小智 1

这是 UNIX 系统中的正常情况。当您 rm 或取消链接打开的文件时。UNIX系统只是标记一个标志,并不会真正删除欺骗的文件。直到文件关闭。并且它会在文件系统中真正被删除。

它是帮助守护进程正常工作的保护。