c程序:为什么remove()会删除一个没有写权限的文件

c program: Why does remove() delete a file with no write permissions

我已经使用 GNU/Linux 超过 10 年了,所以我认为自己对文件权限非常熟悉。

为了测试以下代码,我在 'undo_path' 上使用了 'chmod -w'。然后,我使用 ls -al 验证该文件没有写权限。它显示:

-r--r--r-- 1 andy andy 52 Sep 26 18:17 lastrmw

然后我尝试了代码。两次。两次 remove() 语句都成功了。

if (remove (undo_path))
{
  fprintf (stderr, "Warning: failed to remove %s\n", undo_path);
  perror (__func__);
}

没有写权限的文件怎么能被删除?

我使用的是 Debian 8/Jessie,我的内核是:Linux oceanus 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux

remove() 适用于目录,因此仅当您没有文件夹(而不是文件)的写权限时,它才会起作用。

remove 函数是对目录的操作,从中删除条目。它 不会 删除文件,除非它碰巧产生文件系统自动删除文件的条件。例如,如果同一个文件有两个对应的目录条目或被进程打开,则不会被删除。

删除文件意味着删除目录条目。删除(以及创建)目录条目会影响磁盘上包含目录的块,而被删除的文件使用的块不受影响。事实上,当文件有多个引用(硬链接)时,文件块甚至可能不会被释放。所以它包含被检查的目录的写权限,而不是文件的。