初识Linux · 软硬链接

news2024/10/25 23:22:17

目录

前言:

见见软硬链接

软硬链接的特征

软硬链接的用处


前言:

前文我们介绍了磁盘系统的理解,并且基于磁盘系统对文件系统的整体框架有了一个简单的理解,我们都是通过“想要见识没有打开的文件”这个话题引出来了以上的两个主题,紧随其后的,是软硬链接部分,对于软硬链接部分,我们仍然从是什么 为什么 怎么做来了解这部分的知识点。

那么,进入主题吧!


见见软硬链接

我们通过指令:

ln -s file_target.txt file_soft.link

生成一个链接文件,链接文件指向的是file_target.txt。那么这个链接是软链接还是硬链接我们先不管。

创建好了链接之后,我们往文本里面写入一段Hello world。写入成功之后,我们cat两个文件,发现两个文件都可以打开。 

此时我们执行指令ll:

可以发现file_soft.link是指向了file_target.txt文件的,那么当我们删除了file_target.txt之后:

可以发现file_soft.link这一行就变红了,此时我们尝试打印:

就报错了,说是没有这个文件。

那么我们重复刚才的操作,重新创建一个文件,并用-s选项链接一下:

那么我们试试用上篇文章的知识-inode?

发现它们的inode不是一样的,所以它们是两个独立的文件,而file_soft.link指向的是文件file_target.txt,当文件file_target.txt删除之后,指向失效了,所以bash进程报错。

以上通过选项-s我们可以知道,其实ln -s选项创造的链接就是软连接,因为柔软的英文是soft呗。以上是软连接。

那么我们不妨简单看看硬链接:

我们不带s选项,形成的就是硬链接,所以ln默认形成的是硬链接,此时打印是和软连接一样的:

那么同理,我们先ll一下:

惊奇的发现,inode居然是一样的?

并且发现权限后面的数字还和软连接有点不一样?

那么以上的种种发现,我们进入第二阶段。


软硬链接的特征

我们先聊聊软链接,其实通过上文的介绍,我们已经了解了软连接的部分特性。

软链接本身是独立的文件,如果删除了链接指向的文件,链接属性就失效了,而我们在windows系统上也能得到类似的结果,其实就是windows里面的快捷方式:

像这样,我们点开对应的快捷方式,里面对应的目标,就是属性对应的文件位置,这其实就是一种软链接,而软链接这个文件的内容就是目标位置的路径的字符串。

接下来我们谈谈硬链接:

首先第一个点,硬链接是一个独立的文件吗?

那肯定不是了,因为硬链接不具有独立的inode number,因为它的inode number是来源于file_target.txt的,这是硬链接的第一个特征。

第二个点,后面的数字1 2是什么意思?我们不妨先尝试删除目标文件试试:

删除了之后,我们发现还是可以正常的打印,然后我们重新ll -i一下:

可以发现权限后面的数字已经变成了1,那么我们结合C++11部分的智能指针部分,我们也能大差不差的联想到似乎是引用计数?

答案就是的!这个数字代表的是硬链接数,相当于硬链接数减到0,才会在内核里面free掉struct file对象。

那么,什么是硬链接呢?

硬链接就是在指定目录下,创建新的文件名和inode number的映射关系!!

但是这样我们理解并不深刻,既然Linux中一切皆文件,那么我们想看看目录这个文件对应的硬链接呢?

我们惊奇的发现,test_link的硬链接数居然是2?

凭什么?我们创建这个目录以来,就没有创建过链接啊!!

那么我们看看该目录里面有什么呢?

你看这个. 我们在最开始学习目录的时候,就知道了这个.是用来表示当前目录的!!那么既然是指向的当前目录,那么这是不是一种硬链接呢?当然是的!!

所以目录的默认硬链接数是2。


软硬链接的用处

讨论软硬链接的用处之前,我们需要讨论一个问题:

我们可以有几种方式找到一个文件?

以我们目前学的点来看,目前是两种:

第一是通过路径,第二就是直接找到该文件对应的inode。

那么对于软链接来说,软链接使用的方式就是第一种,直接通过路径,因为软链接这个文件里面的内容就是目标路径的字符串,所以一般对于软链接来说,大小都是1.

那么对于硬链接来说,硬链接使用的方式就是直接找到文件对应的inode,因为硬链接本身就不是一个独立的文件,拥有的inode都是已经创建好的。

那么上文提到,硬链接就是文件备份,并且我们知道了目录默认是有两个硬链接的,一个是目录本身,一个是目录里面的. 指向的就是当前目录,可是我们还知道硬链接里面还有..

对于..来说,我们知道的是它指向的是上级目录,所以:

因为我们在目录里面创建了的还是目录,所以..指向的就是上级目录,即test_link的硬链接数就是3.

所以我们要得到一个目录里面有多少个目录,我们可以直接用该目录的硬链接数 - 2.

那么我们是否可以给目录创建一个硬链接呢?

这是不行的,但是软链接是可以的。

但是为什么不能给目录创建硬链接呢?

这是为了防止形成路径闭环

如果在 /home/user 下创建一个硬链接指向 /home/user,那么通过这个硬链接就可以返回到这个目录,在遍历文件系统时就会形成无限循环。

假设一条路径是/d1/d2/d3/hard-link,对d2创建硬链接hard-link,这会导致用户构建了一个环路路径的问题,如果输入指令find /d1/d2/ -name test.c,在d2目录里找test.c文件,指定在d2目录去找,假设递归式的找,他找到了d3里面的hard-link又把它倒到d2,这个时候他就出现了环路问题,导致出不来了,问题就解决不了了。

对于链接部分,介绍到了这里。

那么此时,你对 ./a.out的理解是否加深了呢?


感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Python与Excel的无缝对接:xlwings库的神秘面纱

文章目录 探索Python与Excel的无缝对接:xlwings库的神秘面纱1. 背景介绍:为何选择xlwings?2. xlwings是什么?3. 如何安装xlwings?4. 简单的库函数使用方法打开工作簿创建工作簿读取单元格数据写入单元格数据保存并关闭…

400V交流智能剩余电流监测系统设计与应用

摘要:针对变电站400V交流系统频繁发生剩余电流保护器跳闸的问题,本研究设计了一套智能化的分布式剩余电流监测系统。该系统利用CT传感器采集400V系统各负载端的剩余电流数据,经过运算处理后,将信息传递给交流绝缘监测装置。随后&a…

>甘晴void:小蒟蒻的CCSP2024

小蒟蒻前两天参加了CCSP2024 最终幸运蹭铜(蹭着本科的边边捞到了铜牌,没有遗憾了)。 评价感受 本来只是来打酱油(蹭吃蹭喝)的,因为自从推免结束后,已经正好一个月没碰代码了,上一次…

DeepLearn-实现天气的识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 本次使用的数据集有晴天、雨天、多云和日出。 导入基本的包 包括读取文件、图像处理、科学计算和tensorflow的api包layers是层模块,提供了神经网络…

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…

利用客户端导入有关联的业务数据(DBeaver+sql)

前言 最近有点坑,麻辣烫的活落手上了,上个迭代除了自己的开发任务,还有处理接手的工作。然后节后问题又多,还有前1个迭代没有测试的模块本迭代测试,烦死了。 这次这个数据处理的活,以后希望可以交出…

香橙派5(RK3588)使用npu加速yolov5推理的部署过程

香橙派5使用npu加速yolov5推理的部署过程 硬件环境 部署过程 模型训练(x86主机) 在带nvidia显卡(最好)的主机上进行yolo的配置与训练, 获取最终的best.pt模型文件, 详见另一篇文档 模型转换(x86主机) 下载airockchip提供的yolov5(从pt到onnx) 一定要下这个版本的yolov5, …

docker集成Nginx和Mysql (教程)

文章目录 前言一、Docker 集成Nginx步骤 1:安装 Docker步骤 2:拉取官方的 Nginx Docker 镜像1.可以先搜索nginx镜像(查看nginx镜像)2.拉取nginx镜像步骤 3:运行 Nginx 容器 二、Docker 集成Mysql步骤 1:拉取mysql镜像步骤2、运行 …

Vulnhub打靶-DC-1

基本信息 靶机下载:https://download.vulnhub.com/dc/DC-1.zip 攻击机器:192.168.20.128(Windows操作系统)& 192.168.20.138(kali) 靶机:192.168.20.0/24 目标:获取2个flag…

SQL 干货 | SQL 半连接

大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi …

tensorflow案例3--运动鞋识别(学习tensorflow动态加载学习率、如何设置早停等方法)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这个案例还是以学习API为主,学习了tensorflow如何动态加载学习率、如何设置早停等方法;这个案例主要学习为主,由于模…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤:1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网:https://www.rabbitmq.com/docs 二、开发步骤:…

Python 实现彩票抽奖系统详解(双色球)

目录 一、系统功能概述 二、代码实现详解 (一)自选功能实现(ziXuanCaiPiao函数) (二)机选功能实现(autoChoiceCaiPiao函数) (三)彩票展示功能实现&#x…

如何解决 IDEA 的 pom.xml 文件中,依赖警告问题

原因 在升级高版本的Idea后,我的是(2024.2)版本。Idea默认引入了插件 Package Checker 插件,用于检查 Maven 的 pom.xml 引入的 jar 包是否有漏洞风险。如果有漏洞风险则直接在引入的 pom.xml 下画黄线警告。 虽然不是错误&…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多,哪一个最好? 先说说我选择的思路,我的目的是开发一个易用的软件,最重要的是稳定,并且碰到问题能够解决,因此,我的目标很明确,有比较大的用户群…

杂项笔记

1 这个好像如果如果分配空间就会执行 这个扩容好像会进行拷贝 2 3 4 没懂 5

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好,我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗?车辆动力学系统简史 本篇文章来源:Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…

数字图像处理的概念(一)

一 何谓数字图像处理 1 图像的概念 图像是对客观存在的物体的一种相似性的、生动的写真或描述。 2 图像的类别 可见光成像和不可见光成像 单波段、多波段和超波段图像 伽马射线成像 主要用途包括核 医学和天文观测 等 。 核医学 a)同位素注射 骨骼扫描图像 b)正电子放射( …

【Docker】安装、镜像、容器

什么是Docker? Docker:是基于Go语言实现的开源项目。 Docker 是一个用于开发、交付和运行应用程序的开放平台。它允许开发人员将应用程序及其依赖包打包到一个可移植的容器中, 然后在任何流行的 Linux 机器上运行。Docker 容器是完全隔离的&…