取消链接后符号链接和硬链接有什么不同?

取消链接后符号链接和硬链接有什么不同?

1.

#include <stdio.h>
#include <unistd.h>

void main(){
    link("foo", "bar");
    unlink("foo");
    if(open("bar", 1) < 0)
        printf("open error\n");
    else
        printf("open succeeded\n");
}

2.

#include <stdio.h>
#include <unistd.h>

void main(){
    symlink("foo", "bar");
    unlink("foo");
    if(open("bar", 1) < 0)
        printf("open error\n");
    else
        printf("open succeeded\n");
}

结果第一个代码为“打开成功”。
并且文件“foo”被删除。只剩下“bar”,其内容与文件“foo”相同。

结论第二个代码是“打开错误”。并且也只剩下“bar”。

为什么会产生这些结果?
1. 特别是,尽管每个硬链接和符号链接(“bar”)都指向文件“foo”,但文件“foo”被删除了。
2. 为什么在 unlink(“foo”)之后“bar”没有被删除。 unlink 函数意味着它删除指向指定文件的链接。(此例为“foo”)
3. 为什么第一个代码和第二个代码的结果不同?

答案1

首先,你确定你以正确的方式获得了程序的输出吗?符号链接版本失败,而硬链接版本成功。

其次,将数字常量作为的标志参数传递open是不可移植的,并且会使您的代码难以阅读。相关标志在中定义<fcntl.h>,而您使用的常量是O_WRONLY

如果您将符号链接作为第一个参数传递给open,则相当于传递符号链接指向的名称。在您的示例中,符号链接指向一个不存在的文件,导致系统调用失败。如果您希望调用创建文件,则需要传递O_WRONLY|O_CREAT标志。这将导致文件foo被创建。

对于硬链接的情况,名称bar链接到foo的文件内容,而不是名称本身。取消链接foo不会改变这一事实,因此bar继续存在,无需 即可打开O_CREAT

答案2

我将快速引用现存的文章,

使用硬链接文件

删除文件时,只有在删除所有文件名部分后,才会处理数据部分。inode 中有一个计数,指示有多少个文件名指向此文件,每次删除其中一个文件名时,该计数都会减 1。当计数为零时,inode 及其相关数据将被删除。

请阅读硬链接和软链接的区别了解详情。

比如,你可能对关于硬链接的其他事实感兴趣,

计数还反映了文件被打开而未关闭的次数(换句话说,仍有多少对文件的引用处于活动状态)。这会产生一些一开始并不明显的后果:您可以删除文件,这样“文件名”部分就不会指向 inode,而无需释放文件数据部分的空间,因为文件仍处于打开状态。

您可以使用测试代码尝试一下。

顺便说一句:你能重新检查一下你的两个案例吗?
我认为你会在 symlink() 案例中得到错误,而在 link() 案例中得到成功。
我建议你在不同的目录中运行它们,或者对这两个案例使用不同的文件名 :-)

相关内容