最初Dos下用md命令创建的文件系统对象也称为“目录”,然后到了Windows时代之后就改名叫“文件夹”了。这种命名的改变使得微软的操作系统对消费用户而言更具有亲和力。而对走冷艳路线的Unix而言,文件的结构与win下并无本质上的区别,也是由文件名,inode(大约相当于win下的FCB文件控制块,保存文件的一些信息)以及数据组成。但独具特色的“链接”概念比起windows的“快捷方式”就要复杂的多了。
首先在RHEL 5.5下创建个内容为aaaa的文件:
echo "aaaaaa" >origin
然后执行:
ls –i origin
44892210 origin
前面数字即为origin文件的inode号。再执行:
ln origin ln_origin
执行:
ls –i ln_origin:
44892210 ln_origin
可以看到 硬链接ln_origin具有同原文件相同的inode号,即是说,ln硬链接是将文件名指向了与原文件相同的inode,所以最省空间。
ln -s origin ln_s_origin
执行:
ln –i ln_s_origin:
44892273 ln_s_origin
可以看到,ln –s 符号链接是拷贝了一份原文件inode,并将inode中的数据块指向原文件的数据块。与ln相比,增加了一个inode占用的空间。
那么cp -s呢
cp –s origin cp_s_origin
然后:
ln –i cp_s_origin
44892274 cp_s_origin
可以看到cp –s 创建了一个类似与ln -s的符号链接,同样复制了新的inode。
若修改ln_s_origin的内容,可以看到origin/cp_s_origin/ln_s_origin三个文件同步发生了改变。可见cp -s与ln -s在文件操作时应该是一样的。这恐怕也是aix等系统未提供cp -s参数的原因。而ln -s还可以为目录创建符号链接,cp -s则不行,这也许是cp –s 与ln -s的主要区别吧。
cp命令没有疑义,不需多说了。
现在把origin文件删除,看会发生什么情况。
rm origin
此时,file ln_s_origin或cp_s_origin,均会出现
ln_s_origin: broken symbolic link to `origin'
的提示。
但ln_origin则可正常编辑使用。
可见ln硬链接后,删除origin文件时,只是删除其一个引用计数,只有引用计数减为0时,才会真正删除文件。
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/535.html