6. 符号链接与硬链接

Unix中包含两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)

1.硬链接

硬链接可以理解为文件的别名,理解可以参照下面的例子:

可以通过函数link为一个文件创建一个硬链接:

creat("./1.txt", 0777);
link("./1.txt", "./2.txt");

这段代码首先创建了一个文件1.txt,然后创建了1.txt的一个硬链接2.txt,1.txt和2.txt目录项指向同一个i节点,i节点中的引用计数为2,这就说明1.txt和2.txt是共用的一块磁盘空间,修改1.txt的数据,2.txt也会跟着改变,因为他们指向同一个i节点,也就是同一块磁盘空间。

当删除目录项1.txt时,unix仅仅是删除目录项,然后把i节点的引用计数-1,此时引用计数由2变为1,当删除2.txt时,引用计数由1变为0,此时才释放数据的磁盘空间。(不一定直接删除,如果此时有进程正在打开该文件,那么必须等到进程退出或者进程关闭该文件才释放磁盘)

创建硬链接有一些局限性:

1.硬链接要求文件和硬链接处于同一文件系统;

2.只有超级用户才能创建目录的硬链接。(需要操作系统支持,很多操作系统根本不支持对目录创建硬链接)

3.在一些遍历文件夹的场合可能造成递归遍历。(比如把目录的硬链接放到该目录或该目录的子目录中)

创建硬链接的命令:ln 已经存在的文件名  硬链接名

举例:

[root@localhost link]# ln 1.txt 2.txt

为已经存在的文件1.txt创建一个硬链接2.txt

2.符号链接

软链接是一种特殊的文件类型,相当于windows下的快捷方式,包含对另一个文件/目录以绝对/相对路径形式的引用。

软链接可以跨文件系统创建,任何用户都可以创建指向文件/目录的符号链接。甚至可以跨越不同机器、不同网络对文件进行链接。

创建文件的软链接时,软链接会使用一个新的i节点(硬链接不会创建新的i节点,所以说软连接是一个新的文件,只是它的内容指向链接的文件而已)。

如果删除源文件,那么符号链接就会找不到源文件,也就无法使用了。

创建符号链接命令:

[root@localhost link]# ln -s 1.txt 2.txt

给文件1.txt创建一个符号链接2.txt

创建符号链接代码:

#include <unistd.h>
int symlink(const char* actuapath, const char* sympath);
actuapath:文件路径,
sympath:符号链接路径
成功返回0,失败返回-1

3.硬链接的和符号连接的对比

  硬链接 符号连接
1 删除一个目录项对其他的没有影响,文件可以继续被访问 源文件被删除后符号链接全部失效
2 不用创建新的i节点 需要创建新的i节点
3 很多系统不支持创建对目录项的硬链接,就算支持也需要root用户 可以随便创建文件及目录的符号链接
4 不能跨文件系统创建 可以跨文件系统,甚至跨越机器,网络创建
5 可以随便移动位置,不会有影响 源文件移动后符号链接不再可用

 

 

posted @ 2021-06-03 22:50  博客员_小李  阅读(484)  评论(0)    收藏  举报