符号链接和硬链接的区别
(1)创建一个硬链接
可以使用命令ln或者函数link()为文件创建一个链接。
#include <unistd.h>
int link( const char *path1, const char *path2 );
硬链接本身就是一个目录项,(比如文件名+索引节点号),可以将文件名与文件的位置关联起来;符号
链接也称软链接,是指存储了一个字符串的文件。这个字符串可以在路径名解析的过程中,用于修改路径名。
目录项对应于单个链接,但是一个索引节点可能有几个链接的目标(对应几个目录项),因此索引节点中包含一个对链接到索引节点的链接数的计数。当用open()创建一个新的文件时,操作系统就会创建一个新的目录项,并分配一个空闲的索引节点来表示该文件。不能够对目录创建符号链接,不能够跨越文件系统创建硬链接。
硬链接只是建立一个目录项(包括inode号和文件名),这个目录项的inode号和被链接文件的inode号相同,如下图:
从上图可以看到,我们建立1.src文件的硬链接过后,发现1.hard的inode号与1.src的inode号是相同的,可以用下图来表示硬链接:
(2) 创建一个符号链接
使用ln命令带选项-s 或者函数symlink(),都可以创建符号链接。
#include <unistd.h>
int symlink ( const char *path1, const char *path2);
符号链接是一个包含了另一个文件或目录名字的文件。引用符号链接的名字会使操作系统去定位对应于那个链接的索引节点,知道最终遇到一个硬间接和一个真正的文件为止。如果过了一段时间,系统没有找到文件,则放弃并返回ELOOP错误。
符号链接,将建立一个文件,所以要占用一个inode节点,在这个inode节点中,存放了指向被链接文件的路径字符串,
从上图中可以看到,当建立1.src文件的符号链接后,1.sym的inode号和1.src是不一样的,1.sym的索引节点中存放了1.src的路径,通过这个路径就可以找到存放文件的索引节点。
可以用下面的图来表示符号链接的过程,
源图片 <http://keren.blog.51cto.com/720558/170979>
可以用下面的图来简易 的表示符号链接和硬链接的区别:
源图片:http://book.51cto.com/art/201005/199721.htm
当将符号链接指向的文件删除时,符号链接将无法使用,因为符号链接是通过路径名去找到被链接文件的,而硬链接通过增加被链接文件索引节点计数来达到链接目的,所以即使被链接文件删除了,硬链接仍然可以正常的使用,如下图:
在上图中,1.sym是1.src的符号链接,1.hard是1.src的硬链接,当1.src被删除过后,访问1.sym出现错误,因为此时系统想通过路径去访问1.src,而1.src已经被删除了。但是由于硬链接是直接通过增加inode的引用计数,所以源文件被删除过后,仍然可以正确的访问。