学习笔记-unix软链接和硬链接的区别

在弄清楚这个问题之前我们要搞明白unix的目录结构!!!!首先我们看看unux系统打开一个文件的结构,如下:


在unix虚拟文件系统中有四大基本对象:

(1)超级块(super block):可以看到每一个分区都有一个超级块,超级块里面大概包含该分区的数据块的大小,允许额最大文件的大小(字节数),文件系统类型,inode总量的大小,未使用和已经使用的inode和block的数量等等。具体内容可参考http://blog.csdn.net/shanshanpt/article/details/38943731

(2)索引结点(inode):索引结点可分为两类目录的索引结点和文件的索引结点(大小通常为128字节),unix系统采用inode来记录文件或是目录的属性,这些属性包括文件的访问模式,文件的所有者与组,文件的大小,文件的真正内容(就是存放在该分区的哪一个block上),最近修改时间,创建时间等等。下面是inode的示意图:


(3)目录项(dentry):最重要的就是记录文件名字(目录名字)到inode的映射关系

(4)文件对象(file):文件对象不是文件,在c语言中我们要打开一个文件首先得申请一个FILE *fp指针,也就是当我们调用fopen()函数返回一个文件对象的指针,然后我们就可以对这个指针进行操作从而来进行读写。文件对象里面一般有引用计数,目前文件读写位置相对于文件开头的偏移,文件buffer(一般为4096Kb,我们用write写文件成功时,数据并不是被真正写到文件,而是被复制到了与该文件相关的缓冲中,当缓冲类型是行缓冲时,一旦遇到/n就刷新文件缓冲区,缓冲区的内容就会被写到文件,如果是全缓冲,则只有当缓冲满的时候,或调用exit,fflush函数的时候,缓冲区会被刷新,同样数据会被写到文件中,这样设计是因为如果每次写数据都调用write系统调用则开销特别大,比如上下文切换等等,尤其是每次只有很少几个字节需要写的时候,所以就会先将数据存放在一个缓冲区中,然后再一起写入)等等。

以下是unix系统文件进程打开文件的示意图:




对于文件和目录在unix系统中的组织方式如下:


下面我们来讨论软链接和硬连接的区别和联系:

(1)硬链接:当创建一个文件或是目录的硬链接时就是在目录里面创建一个新的目录项,目录项的名字和原来被连接的对象名字不同,但是inode结点的值是一样的!!

(2)软链接:创建的新的目录项的名字和inode值和原来的对象都不一样!!

下面用一张图来演示一下:


在上面的图中,一共有三个目录,分别是目录1(inode结点为1235),目录2(inode结点为1234),目录3(inode结点为(inode结点为1239),现在我们在目录3下创建了一个目录2的硬链接,取名为目录5,由于是硬链接,它没有占用新的inode结点,而是指向了目录2的inode结点,那么就会出现问题!!

(1)对于目录2来说,由于目录2的inodej结点成为了目录3下的一个目录项,那么在逻辑上目录2中的..对应的inode值应该是1239而不是1235,如果把1235改成1239,那么目录1中明明有目录2这一项,但是目录2中的..对应的inode值却不是它的上一级目录的block块!!

(2)对于目录3来说,它含有一个inode结点为1234的目录项,再到inode值为1234对应的block中查看,得知目录2的父目录的inode值为1235,那么在目录2的.对应的inode值应该为1235,如果是这样的话那么目录3中...对应的inode值相同,这在unix系统里面是不允许的,这就是所谓的形成环(loop),因为我们使用cd..命令的时候还是在本层目录,不能进入其父目录中。


限制

硬链接:

a.不能对目录创建硬链接,因为会导致不能返回父目录,上面已经分析过了。

b.不能对不同的文件系统创建硬链接,为什么?因为在不同的分区下,即便是同一个inode,对应不同的block块!!!inode值只在本分区下有效。。。

软链接:

a.可以对目录创建软链接,遍历操作会忽略目录的软链接。

b:可以跨文件系统。对文件创建一个软链接,那么这个文件的内容在unix系统中是链接对象的路径名.

测试:

首先我们看到文件夹下面只有一个


当我们连续输入下面两条命令之后:


我们可以看到有两个文件的inode是一样的562483,但是它们的文件名字不一样,说明在soft-hard-link里面有两个目录项的inode一样,它们所指向的block的大小都一样,还有一点就是在文件读写权限之后的数字2,这个代表数据block目前有两个inode指向它,就是名字不一样,这就是硬链接,当我们移除des.txt文件的时候:


我们可以看到这个引用计数的数量变成1,但是文件依然存在!!!


我们可以看到对三个文件进行cat操作输出都一样,对src1.txt链接文件来说,它拥有一个全新的inode,它的大小为7个字节,至于为什么是7个字节,鸟哥私房菜的解释是src1.txt文件的内容就是src.txt,所以是7个字节,这个还有待求证!!!!


一旦我们将源文件src.txt进行删除,那么链接文件src1.txt就会失效(变成红色,无效链接!!!)

从上面的分析和测试我们可以大概了解了unix系统的文件组织方式以及软连接和硬链接的区别以及它们在底层原理的实现!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值