获奖+答案公布:Linux符号链接和硬链接的小测试

假设目录“~”下面不存在a, b, c这样的文件,在该目录下面执行如下命令:

题目步骤

$ echo hello > a $ ln a b

$ ln -s a c

$ rm a $ echo world > a

请问接下来执行“cat b”输出什么?执行"cat c”输出什么?解释为什么!详细论述其中关于inode等的变化。


虽然很多童鞋的答案都是正确的,但是获奖名单只能有三人。众多童鞋的回答参见做题免费送书:关于Linux符号链接和硬链接的小测试的留言。

我们根据答案回复的先后顺序,答案的精细度、准确度和完整度,选取了3个优胜者。获奖名单与答案如下:

wsl

“cat b” 的输出是 hello, “cat c” 是world

首先解释为什么”cat b“ 输出是hello, b 文件是a 文件的硬链接,而硬链接实际
是同一个文件,因为他们的inode number 是相同的。比如笔者的测试环境:
$ ls -i a
473972 a
$ln a b
$ ls -i b
473972 b

既然是同一个文件,a 和b 的文件内容相同,虽然第四步删除了文件a 但是inode 引用数只是减了1,
并不为0,inode 并没有删除。

下面解释为什么 “cat c”的输出
首先创建了一个名为c 的软连接,c 本质上是一个新文件(inode number不同于a)c 的文件内容是a的路径
$ ls -i c
480580 c

$cat c
hello
此时cat c,默认读一个link 文件, 内核FOLLOW_LINK, 也就是会读c 指向的文件a的内容。
第四步删除了a, 此时c 文件本身不受影响,c文件内容也不受影响,但是如果此时cat c
则会输出:

cat: c: No such file or directory

因为FOLLOW link目标文件,目标文件已经不存在了。最后一步重新创建了一个a 文件,
cat c 会输出新创建文件的内容。本质上c 文件始终没有发生变化,他的内容是就是a 的path.

红烧的威化饼

cat b显示的是hello
cat c显示的是world
原因
echo hello > a 新建a(设inode number为10),内容为hello
ln a b,创建硬链接b,和a共用一个inode,不同的dentry
ln -s a c 创建软连接c指向a,不与a共用inode
rm a 删除a文件,由于inode10有两个reference,只把它的reference减1,不删除数据,但是由于a没了,
所以c这个软连接失效。
echo world > a 新建一个新文件,假设inode number为20,内容为world,此时a和b是两个不同的文件,c是软链接指向a

桂雄~

$ echo hello > a
这里会创建a文件,此时a文件内容是hello
$ ln a b
这里创建了一个硬链接b,b与a指向同一个inode
$ ln -s a c
这里创建了一个软链接c,c的文件的实际内容就是a文件的路径
$ rm a
删除a文件对b没有影响,不过这个inode的引i_nlink就会减一,但是c文件的由于保存的是a文件路径名指向,因此a文件被删了后,c文件的指向就不存在了,此时cat c会报文件不存在的错误。
$ echo world > a
此时echo world又创建一个文件,文件名是a,但是此时的inode已经是重新申请到的,a与b已经不是硬链接关系了,但是c文件的软链接文件a又存在了,因此此时c文件cat的话就不会报错了

cat b的话会输出hello
因为这是在最初a创建的时候写进去的,然后b跟他共享了inode,因此文件内容还是hello
cat c的话输出world
这里c是新建的a的软链接,这个a文件已经不是原来的a文件,c文件软链接的也不是原来的a文件,而是最后输入world的时候创建的新的a文件。而c文件软链接到了a文件,因此cat到的就是新的a文件内容。

恭喜这三位童鞋!!祝大家中秋快乐。

640?wx_fmt=png


查看"Linux阅码场"精华技术文章请移步:

Linux阅码场原创精华文章汇总


扫描二维码关注"Linux阅码场" 

640?wx_fmt=png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值