在unlik之后,与硬链接有什么不同的符号链接?

1。

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

2。

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

第一个代码的结果是“打开成功”。
并删除文件“foo”。 只保留“bar”,其内容与文件“foo”相同。

reslut frome 第二个代码是“打开错误”。 而且还只是“酒吧”。

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

我将从现有文章中快速参考,

使用硬链接文件

删除文件时,在删除所有文件名部分之前,不会丢弃数据部分。 inode中有一个计数,指示有多少文件名指向此文件,并且每次删除其中一个文件名时该计数减1。 当计数使其为零时,将删除inode及其相关数据。

有关详细信息,请阅读硬链接和软链接之间的区别 。

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

计数还反映文件在未关闭的情况下打开的次数(换句话说,对文件的引用数仍然有效)。 这有一些影响,一开始并不明显:你可以删除一个文件,这样没有“文件名”部分指向inode,而不释放文件数据部分的空间,因为文件仍然是打开的。

您可以尝试使用您的测试代码。

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

首先,你确定你已经以正确的方式得到了节目的输出吗? 我的符号链接版本失败,硬链接版本成功。

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

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

对于硬链接案例,名称bar链接到foo的文件内容而不是名称。 取消链接foo不会改变这个事实,因此bar继续存在并且可以在没有O_CREAT情况下打开。