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() 案例中得到成功。
我建议你在不同的目录中运行它们,或者对这两个案例使用不同的文件名 :-)