要理解软链接和硬链接需要首先理解文件系统的原理,这里以EXT2文件系统为例。
Ext2文件系统由3部分组成:
super block
记录此文件系统的整体信息,包括 inode/block 的总量,使用量,剩余量。以及文件系统的格式与相关信息。
inode
一个文件占用一个inode,记录文件的属性和权限等,同时也记录此文件的数据所在的block号码。
block
实际记录文件内容,若文件太大时,会占用多个block。
每个inode和block都有编号,而每个文件都会占用一个inode,同时记录此文件数据所在的block号码。因此,我们知道一个一个文件的inode,也就自然知道这个文件所放置数据的block号码,当然也就能够读出文件的实际数据。
链接文件
Linux下的链接文件有2种:
hard link(硬链接)
使用命令:ln 源文件 目标文件
我们知道文件名只与目录有关,但是文件内容则与 inode 有关。硬链接就是多个文件名对应同一个inode。
- hard link 只是在某个目录下的 data block多写入一个:文件名->inode,它不会消耗 inode 也不会消耗 block。
- 它不能跨文件系统
- 它不能链接到目录
symbolic link(符号连接,也即是软链接)
使用命令:ln -s 源文件 目标文件
symbolic link 就是在创建一个独立的文件,而这个文件里的数据就是它链接的那个文件的文件名。
readlink
-
readlink 命令
readlink 命令输出符号链接值或指向的源文件名(通常使用的是 -f 参数)
- readlink函数
#include<unistd.h> ssize_t readlink(const char *path, char *buf, size_t bufsiz);
readlink()
会将参数path的符号链接内容存储到参数buf所指的内存空间。
注意:返回的内容不是以\0
作字符串结尾,但会将字符串的字符数返回。
失败返回 -1,并设置errno
。
参考资料
1、https://www.cnblogs.com/kwdeblog/p/11413756.html
2、https://blog.csdn.net/qq_41982304/article/details/82263478
3、https://blog.csdn.net/qq_16209077/article/details/51974359