【Linux】软硬链接

文章目录

软链接

软链接是一种指向文件或目录的快捷方式,是文件系统中非常重要的功能。它类似于Windows中的快捷方式,但更灵活,可以跨文件系统创建。

ln操作: ln是 Linux 中用于创建链接文件的命令,主要支持创建 硬链接 和 软链接。

创建软链接:

创建一个txt结尾的空文本文件。

cpp 复制代码
ln -s file.txt file

用上面这命令为file.txt创建软链接,软链接的名字是file。

查看一下这两个文件的inode:

可以看见这两个指向的是不同的inode,说明file是一个独立的文件。

我们向file中写入字符串,可以看见在file和file.txt中都能查看到。

软连接保存的是目标文件的路径,软链接就等同于Windows下的快捷方式,所以当我们修改file时,file.txt也会跟着改变,修改file.txt时,file也会跟着改变,软链接本质上底层保存的是对应文件路径,这个路径索引指定文件

硬链接

硬链接是指直接指向文件 inode 的链接,所有硬链接共享同一个 inode 和文件内容。硬链接在底层的机制与软链接不同,其主要特点在于它与目标文件紧密绑定。

创建硬链接:

cpp 复制代码
ln file.txt file-hard

通过对比硬链接和原文件,硬链接本质上不是一个独立的文件,因为硬链接的inode和原文件的inode相同,可以看见中间还有一行数字是1,2,2这一行数字是引用计数,记录硬链接数,我们打开Linux的代码:

可以看见在Linux的代码中,inode这个结构体中有一个count,这个count就是用来记录硬链接数的,当有一个文件名索引到这个inode的时候这个count就是1,两个文件名索引到这个文件名,这个count就会++。

理解了软硬链接之后,聊一聊软硬链接的使用场景

软硬链接的使用场景:

软链接的使用场景

快捷方式
上面这个图就是一个例子,Windows当中的快捷方式,存储的就是目标的路径,索引到目标位置。

硬链接的应用场景

首先我们来创建一空的目录。

可以看见新创建的文件的硬链接计数为什么是2呢?

进入到empty中,发现当中有....指向的是当前路径,我们来看看.的inode和empty的inode。

可以看见.的inode和empty的inode是相同的,说明.是empty的硬链接,这里.和empty同时指向一个inode,所以硬链接计数是2.

我们在硬链接中创建一个空目录。

在empty创建了一个空目录,为什么硬链接计数会变为3呢?

我们打开新建文件:

可以看见新建文件中有一个..,...是指向上一个文件的,而上一个文件就是empty,empty当中也也有一个.,这个指向的是本文件,也就是empty,三个文件名同事指向同一个inode,所以硬链接计数是3。,我们来对比一下inode:

可以看见三个文件名指向的确实是一个inode。

总结

软链接和硬链接是 Linux 文件系统中提供的两种链接方式,它们在功能和实现上有显著的区别。软链接通过路径指向目标文件,灵活性更强,可以跨文件系统,但目标文件被删除后会失效;硬链接直接指向文件的 inode,所有硬链接共享相同的文件数据,文件更改会同步,但不能跨文件系统且不能指向目录。

在实际应用中:

  • 软链接适合用于需要跨文件系统、指向目录或者希望链接易于修改的场景。
  • 硬链接则适用于在同一文件系统内需要保证文件数据持久存在的情况,例如备份或多点访问文件。

理解两者的特点和使用场景有助于在开发和管理文件系统时作出更优化的选择。

相关推荐
高冷的肌肉码喽24 分钟前
Linux-进程间的通信
linux·运维·服务器
乖乖是干饭王28 分钟前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
weixin_4786897632 分钟前
C++ 对 C 的兼容性
java·c语言·c++
jekc86835 分钟前
禅道18.2集成LDAP
linux·运维·服务器
k要开心37 分钟前
C++概念以及基础框架语法
开发语言·c++
weixin_4349362842 分钟前
k8S 命令
linux·容器·kubernetes
weixin_307779131 小时前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse
秦少游在淮海2 小时前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用
Tender_光2 小时前
iptables实验
运维·服务器
const5442 小时前
cpp自学 day2(—>运算符)
开发语言·c++