概述
Linux系统中为了解决文件共享问题,引入了软链接和硬链接的概念,软链接又称符号链接,即soft link
或symbolic link
,硬链接即为hard link
。
同时它们还带来了隐藏文件路径、增加权限安全及节省存储等好处。
若一个文件指向另一个文件,该文件的内容仅仅是另一个文件的path
,则其为软链接。
若一个inode号
对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。
软链接可由命令ln
创建,硬链接可由命令link或ln
创建。
硬链接
由于硬链接的文件是有着相同inode号
,仅文件名不同,因此硬链接存在以下几点特性:
- 文件有相同的
inode 和 data blocks
- 只能对文件创建硬链接,不能对目录创建硬链接
- 只能对已存在的文件创建硬链接
- 不能跨文件系统创建硬链接
- 删除一个硬链接文件并不影响其他有相同
inode号
的文件
1 | $ ll |
因为硬链接文件具有相同的地位,并没有谁指向谁之说,所以想要查找一个inode号
对应的所有硬链接文件并不容易,通常需要遍历目录下所有的文件,系统里可通过find
命令查找一个文件相关的所有硬链接文件。
1 | $ mkdir dir |
可以通过命令strace find ./ -samefile tstfile
查看具体执行的系统调用,发现该命令会在输入的目录下查询所有的文件,输出与参数文件inode num
一致的文件,所以在目录里文件非常多时,该命令会非常耗时的。
软连接
软链接与硬链接不同,若一个文件的数据块中存放的内容是另一文件的路径名时,则该文件就是软链接。
软链接就是一个普通文件,只是数据块内容有点特殊。
软链接有着自己的inode
号以及数据块,因此软链接的创建与使用没有类似硬链接的诸多限制。
软链接的特性如下:
- 软链接有自己的文件属性及权限等
- 可对不存在的文件或目录创建软链接
- 软链接可跨文件系统创建
- 软链接即可对文件创建,也可对目录创建
- 创建软链接后,链接计数
i_nlink
不会增加 - 删除软链接并不影响被指向的文件
- 若被指向的原文件被删除,则相关软连接被称为死链接(dangling link),若被指向路径文件被重新创建,即恢复为正常的软链接
1 | $ ln -s tstfile slink |
测试程序
Linux里由命令stat
来获取一个文件的状态,文件状态保持在数据结构struct stat
里,定义如下:
1 | struct stat { |
其中st_mode
变量用来表示文件类型的,特征位的定义如下:
1 | S_IFMT 0170000 bit mask for the file type bit fields |
POSIX标准里定义了如下的宏来检查文件类型:
1 | S_ISREG(m) is it a regular file? |
结合上面的描述,我们可以写如下测试代码:
1 | $ cat file_stat.cc |
命令行输出
1 | $ ./file_stat hlink |
参考
https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
http://www.giannistsakiris.com/2011/04/15/counting-and-listing-hard-links-on-linux/