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
函数是对目录的操作,从中删除条目。它 不会 删除文件,除非它碰巧产生文件系统自动删除文件的条件。例如,如果同一个文件有两个对应的目录条目或被进程打开,则不会被删除。
删除文件意味着删除目录条目。删除(以及创建)目录条目会影响磁盘上包含目录的块,而被删除的文件使用的块不受影响。事实上,当文件有多个引用(硬链接)时,文件块甚至可能不会被释放。所以它包含被检查的目录的写权限,而不是文件的。
我已经使用 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
函数是对目录的操作,从中删除条目。它 不会 删除文件,除非它碰巧产生文件系统自动删除文件的条件。例如,如果同一个文件有两个对应的目录条目或被进程打开,则不会被删除。
删除文件意味着删除目录条目。删除(以及创建)目录条目会影响磁盘上包含目录的块,而被删除的文件使用的块不受影响。事实上,当文件有多个引用(硬链接)时,文件块甚至可能不会被释放。所以它包含被检查的目录的写权限,而不是文件的。