Linux:软硬链接的概念与应用

文章目录

  • 软链接和硬链接
  • 软链接的应用场景
  • 硬链接的应用场景
  • 当前目录和上级目录
  • 总结

本篇要探讨的主题是关于软硬链接的概念

在Linux系统链接文件中有两种,一种是硬链接,一种是软链接,那么本篇就基于上述的两种链接方式来进行一定的总结和拓展

软链接和硬链接

假设现在我创建了这样的一个文件test.c,然后我执行了这样的指令

ln -s test.c newtest.c

这就是一层软链接,这样就建立起来了一个newtest.c,它链接到了test.c

那这是什么意思呢?这个软链接有什么用呢?

先观察一下属性:

在这里插入图片描述
从中可以发现,这两个文件的inode值不一样,并且链接好的这个文件有一个指向表明它是链接到这个test.c

再看硬链接的操作:

ln test.c hardtest.c

在这里插入图片描述

这里看出,这两个文件的inode值居然是一样的,并且还有一个数字从1变成了2,这是什么呢?有什么意义和价值呢?该如何理解呢?后面来介绍

首先可以得到一个初步结论

软链接提供的是一个独立的文件,而硬链接并不是一个独立的文件,原因是软链接有自己独立的编号,但是硬链接没有,所以从直白的角度来说就是这样的区别

第二个结论是,软链接其实可以类比成是一种快捷方式,为什么要有快捷方式?

其实原因就在这个字面意思上,因为快捷,在Windows系统中,想要调用一个文件有很多种方式,其中一个方式就是在桌面上调用它的快捷方式,还有一种方式是找到它的绝对路径下访问它的exe文件,很明显对于大部分使用场景来说,直接在桌面调用它的快捷方式是一种很便携的方式,而这里的软链接也是如此,我们假设现在的场景

软链接的应用场景

现在有一个test.c,里面存放了一些源代码,并且现在把他编译形成了一个可执行程序,如果我想正常运行它,就必须要找到它所在的绝对路径,然后运行它,这是没问题的,下面是对应的操作

[test@VM-16-11-centos Symbolic and Hard Link]$ ll
total 4
-rw-rw-r-- 1 test test 77 Jan 18 10:35 test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ gcc -o test.exe test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ ./test.exe
hello world

但是缺点也很明显,我想要运行这个文件,必须要在Symbolic and Hard Link这个文件夹下进行运行,如果我不想在这里运行,我想去别的地方也能轻松的访问到可以吗?这就需要借助软链接的帮助了

test@VM-16-11-centos linux-system-and-network]$ ln -s ./Symbolic\ and\ Hard\ Link/test.exe softtest
[test@VM-16-11-centos linux-system-and-network]$ ll
total 28
drwxrwxr-x  4 test test 4096 Dec  7 21:12 File
drwxrwxr-x  3 test test 4096 Nov 16 18:25 Mybash
drwxrwxr-x  2 test test 4096 Dec  7 21:13 my_c_lib
drwxrwxr-x 11 test test 4096 Dec  7 21:06 Process
-rw-rw-r--  1 test test  107 Dec  7 21:08 README.en.md
-rw-rw-r--  1 test test   89 Dec  7 21:08 README.md
lrwxrwxrwx  1 test test   33 Jan 18 10:44 softtest -> ./Symbolic and Hard Link/test.exe
drwxrwxr-x  2 test test 4096 Jan 18 10:36 Symbolic and Hard Link
[test@VM-16-11-centos linux-system-and-network]$ ./softtest 
hello world

此时达成的效果其实与创建了一个快捷方式基本一样,软链接的主要运用场景就在于快速定位文件信息

那么工作的原理是什么呢?由前面的例子可以有初步的理解是,软链接有一个独立的inode编号,这也就意味着在创建软链接的时候会在文件系统中做出修改,会修改文件系统中位图和数据块等等的信息,而软链接出来的文件也是文件,既然是文件就必然会有内容和属性,那么就分别进行讨论文件中到底放的是什么东西?

内容:既然是软链接,那软链接内部的内容就是指向的目标文件的路径,换句话说可以认为,软链接文件的内容中保存的是目标文件
属性:和普通文件基本一致

硬链接的应用场景

关于硬链接,可以从它和软链接的区别入手,一个很明显的区别就是,硬链接不是一个独立的文件,它的inode编号和原来的文件是相同的。这意味着硬链接和目标文件从inode获取的编号是一样的,也就意味着访问的会是同一个文件的属性和同一个属性的内容,在前面的知识中提到过,文件名其实并不是文件的属性,文件名只是在目录的数据块中会和文件的inode编号建立一个映射关系,也就是说inode和文件名是分开存储的,也就是说硬链接产生的文件其实就是新建了一层映射关系,只不过这个inode的映射关系建立的是一个前面的已经存在的inode,只是新增了一个映射关系

最后要谈到的一点是这个数字的问题


这个数字到底是什么呢?现在也不陌生了,这个数字其实就是硬链接数,这个有多少个映射关系指向这个inode,那么这个硬链接数也会随之而发生变化,从中得出的结论是,如果这个文件被删除了,但是它还有其他的硬链接数,那么它实际上被删除了吗?其实是没有的,那么什么情况下才是真正被删除了呢???

答案是,没有inode和它本身进行映射,也就意味着用户已经不需要这个inode了,在用户关心的这些文件中已经没有任何一个文件指向这个inode编号,那么不就意味着这个文件被删除了吗,而删文件在操作系统层面上就是删位图,把位图删除掉,就算是把这个文件清空了,那么在文件系统的层面上,它怎么知道有多少文件指向了我呢?文件该如何知道,自己在什么时候已经被用户所抛弃了,不再需要了呢?其实就是引出到了引用计数的概念,这个词也并不陌生,在前面的智能指针部分已经有了一个明确的概念,那么这里就不多进行阐述了,那么新增硬链接和删除硬链接本质上就是对这个inode的引用计数进行新增和删除,等到这个inode的引用计数变成0的时候,就意味着这个inode编号没有任何一个文件名和它建立联系,那么就算是真正意义上的删除了

文件名在目录中是唯一的,从某种意义来说,文件名就是一种指针,它指向了一个一个的inode,当文件名去掉一个指针,这个引用计数就减去1,而新增一个硬链接数,就相当于是有一个东西指向了这个inode编号,引用计数就加1

硬链接的本质就是相当于文件名和inode之间建立一层映射的关系,文件名相当于是一个指针,指向的是inode的编号,当我们需要访问的时候,就通过这个引用指针对这个文件进行新增或删除,删除的意义就是把这层文件名和inode编号之间的映射删除,并且同时对这个inode编号的引用计数减去1,当没有任何一个文件名指向它的时候,就表示要删除了,就把它在位图中进行合适的修改即可

当前目录和上级目录

有了这些基础知识,那么就可以根据这些知识解释一些现象了:

在这里插入图片描述
新建一个文件夹,它的硬链接数是2?为什么呢?

在这里插入图片描述
原因是有两个文件名指向这个inode,一个是上级目录,一个是当前目录,所以在这个目录中:

在这里插入图片描述
所以这个目录下就存在一个叫做当前目录的文件,它指向的就是这个inode,而它本身也会指向一个inode,所以就有两层映射关系

在这个目录下再新建一个目录,引用计数变成3了,这是为什么呢?

在这里插入图片描述

这就是上级目录的功劳了!在原来的基础上又多了一个上级目录指向了这个文件,自然引用计数就再加1了
在这里插入图片描述
从这个例子中也能看出来,为什么在调用cd ..这个命令的时候可以回到上级目录?凭什么?凭的就是上级目录中存储的是上级目录的inode,我借助这个inode就是能进入这个目录下进行访问

总结

自此,就解决了软硬链接的问题,硬链接本身就是这样来进行路径的切换,用户用硬链接来构建Linux的整个路径结构,方便进行路径的回退,这就是硬链接的意义

那软硬链接的区别是什么?区别之一就是软链接是一个真正的文件名,有自己的文件名和inode,文件内部的内容存储的是目标文件,但是不能对于目录进行软链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331210.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOS-UIAlertController简单使用-Swift

UIAlertControlle时IOS的对话框控制器(警报控制器),简单使用方法如下: 步骤都一样,先是创建UIAlertController,然后创建UIAlertAction,再将UIAlertAction添加到UIAlertController中,…

Keil 的安装

Keil的安装,分3个主要步骤: ① 安装Keil软件 ② 注册 ③ 安装芯片支持包 一、安装 Keil 重点 1: 安装时,不能使用中文路径,否则无法正常使用!! 重点 2: 不要安装 V5.36 及以上的版本&#xff0c…

Qt SDL2播放Wav音频

这里介绍两种方法来实现Qt播放Wav音频数据。 方法一&#xff1a;使用QAudioOutput pro文件中加入multimedia模块。 #include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput>int main(int argc, char *argv[]) {…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…

精品IDEA插件推荐:Apipost-Helper

Apipost-Helper是由Apipost推出的IDEA插件&#xff0c;写完接口可以进行快速调试&#xff0c;且支持搜索接口、根据method跳转接口&#xff0c;还支持生成标准的API文档&#xff0c;注意&#xff1a;这些操作都可以在代码编辑器内独立完成&#xff0c;非常好用&#xff01;这里…

Linux的权限(2)

目录 Linux的&#xff08;事物属性&#xff09;文件权限 文件权限值得表示方法 字符表示方法 8进制表示方法 文件访问权限得相关设置方法 chmod修改权限法1 chmod修改权限法2 文件的角色&#xff08;拥有者/所属者&#xff09;修改 chown拥有者 chgrp所属者 &…

【网站项目】基于jsp的拍卖网站设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

[C++] 如何在Windows下使用vs 2022的vc++项目访问mysql 8?

关于mysql connector/C++ mysql connector/C++是官方提供的C++驱动程序,如果我们想通过C++代码来访问Mysql8,就必须借助它。 MySQL :: MySQL Connector/C++ Developer Guide GitHub - mysql/mysql-connector-cpp: MySQL Connector/C++ is a MySQL database connector for C…

浅聊雷池社区版(WAF)的tengine

雷池社区版是一个开源的免费Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;专为保护Web应用免受各种网络攻击而设计。基于强大的Tengine&#xff0c;雷池社区版提供了一系列先进的安全功能&#xff0c;适用于中小企业和个人用户。 Tengine的故事始于2011年&#xff0c;…

深入了解性能优化(web应用)

影响一个系统性能的方方面面 一个 web应用不是一个孤立的个体,它是一个系统的部分,系统中的每一部分都会影响整个系统的性能 一.常用的性能评价/测试指标 1.响应时间 提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。 常用操作的响应时间列表: 操作 响应…

跑通 yolov5-7.0 项目之训练自己的数据集

yolov5 一、yolov5 源码下载二、配置环境&#xff0c;跑通项目三、训练自己的数据集1、获取验证码数据2、标注图片&#xff0c;准备数据集3、开始训练自己的数据集1、train.py 训练数据集2、val.py 验证测试你的模型3、detect.py 正式用你的模型 四、遇到的报错、踩坑1、import…

AD导出BOM表 导出PDF

1.Simple BOM: 这种模式下&#xff0c;最好在pcb界面&#xff0c;这样的导出的文件名字是工程名字&#xff0c;要是在原理图界面导出&#xff0c;会以原理图的名字命名表格。 直接在菜单栏 报告->Simple BOM 即可导出物料清单&#xff0c;默认导出 comment pattern qu…

springboot 原理分析之自动配置

一、Condition Condition 是在 Spring 4.0 增加的条件判断功能&#xff0c;通过这个可以功能可以实现选择性的创建 Bean 操作。比如说&#xff0c;只有满足某一个条件才能创建这个 Bean&#xff0c;否则就不创建。 SpringBoot 是如何知道要创建哪个 Bean 的&#xff1f;比如 Sp…

[C++] opencv - copyTo函数介绍和使用案例

copyTo函数介绍 copyTo函数是OpenCV库中的一个成员函数&#xff0c;用于将一个Mat对象的内容复制到另一个Mat对象中。 函数原型&#xff1a; void cv::Mat::copyTo(OutputArray m) const;void cv::Mat::copyTo(OutputArray m, InputArray mask) const; 参数说明&#xff1a;…

动手学深度学习6 自动求导

自动求导 1. 自动求导2. 自动求导实现1. 示例 y 2 X T X y2X^TX y2XTX 关于列向量x求导。2. 非标量变量的反向传播3. 分离计算4. Python控制流的梯度计算 QA 视频&#xff1a; https://www.bilibili.com/video/BV1KA411N7Px/?spm_id_fromautoNext&vd_sourceeb04c9a33e87…

STL中的stack、queue以及deque

目录 一、关于deque容器&#xff08;双端队列&#xff09; 1、deque的底层实现 2、deque的缺点 3、关于stack与squeue默认使用deque容器 二、stack简介 1、stack的成员函数&#xff08;接口&#xff09; 2、stack的模拟实现 三、queue简介 1、queue的成员函数&#xff08…

js:锚点滚动到页面对应区域

锚点跳转到对应页面的区域使用 scrollIntoView // anchor即你要跳转到的元素 anchor.scrollIntoView({behavior: "smooth", block: "center", inline: "nearest" });1、behavior&#xff1a;定义滚动行为。它可以设置为 “auto” 或 “smoo…

老师布置作业的技巧有哪些

布置作业可不只是简单地给学生分配任务&#xff0c;而是需要运用一些技巧&#xff0c;以达到更好的教学效果。那么&#xff0c;老师应该如何布置作业呢&#xff1f; 一、作业要有针对性 布置作业时&#xff0c;老师应该根据学生的实际情况和课程要求&#xff0c;有针对性地设…

小程序商城在易货模式中的可行性

一、引言 随着科技的快速发展和互联网的普及&#xff0c;电子商务已经深入人们的生活。小程序商城作为电子商务的一种形式&#xff0c;凭借其便捷性、高效性和广泛覆盖的优势&#xff0c;成为商业领域的新宠。本文将探讨使用小程序商城实现易货模式的可行性。 二、小程序商城的…

Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

733.图像渲染 题目链接&#xff1a;https://leetcode.com/problems/flood-fill 解法&#xff1a; 可以用深度优先搜索和广度优先搜索。 深度优先搜索。每次搜索到一个方格时&#xff0c;如果其与初始位置的方格颜色相同&#xff0c;就将该方格的染色&#xff0c;然后继续对…