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”被删除。仅保留内容与文件“foo”相同的“bar”。
第二个代码的结果是“打开错误”。而且也只剩下“酒吧”。
为什么会产生这些结果?
1. 特别是,虽然硬链接和符号链接(“bar”)都指向文件“foo”,但文件“foo”被删除了。
2. 为什么在 unlink("foo") 之后 "bar" 没有被删除。unlink 函数意味着它删除了指向指定文件的链接。(本例为“foo”)
3. 为什么第一个代码和第二个代码的结果不同?
首先,您确定您以正确的方式获得了程序的输出吗?符号链接版本失败,硬链接版本成功。
其次,将数字常量作为标志参数传递
open
是不可移植的,并且使您的代码难以阅读。相关标志定义在 中<fcntl.h>
,而您使用的常量是O_WRONLY
。如果将符号链接作为第一个参数传递给
open
,则相当于传递符号链接指向的名称。在您的示例中,符号链接指向一个不存在的文件,导致系统调用失败。如果您希望调用创建文件,则需要O_WRONLY|O_CREAT
作为标志传递。这将导致文件foo
被创建。对于硬链接情况,名称
bar
链接到foo
的文件内容而不是名称。取消链接foo
不会改变这一事实,因此会bar
继续存在并且可以在没有O_CREAT
.我将从现有文章中快速参考,
使用硬链接文件,
有关详细信息,请阅读硬链接和软链接之间的区别。
就像,您可能对硬链接上的其他事实感兴趣,
你可以用你的测试代码试试。
顺便说一句:你能重新检查你的两个案例吗?
我认为你会得到 symlink() 案例的错误和 link() 案例的成功。
我建议您在不同的目录中运行它们或为这两种情况使用不同的文件名:-)