Linux--文件链接

目录

1.建立软连接

2.建立硬链接

3.什么是软链接

Linux中软链接的应用场景

4.什么是硬链接

5.文件与目录的硬链接数

6.软链接与硬链接的区别

用户无法对目录建立硬链接,可以建立软连接。


在Linux中文件的链接有两种:1.软连接  2.硬链接

1.建立软连接

建立软链接指令:

ln -s 被链接文件名 建立链接名

举例:为log文件建立一个软链接,名字为log.soft.link

这里log.soft.link这个软链接指向了log这个文件。

同时我们通过指令:

ll -li

这里我们可以发现log文件与软链接的inode编号是不一样的。说明log与软链接是两个互相独立的文件

2.建立硬链接

建立硬链接指令:

ln 被链接文件 链接名

举例:为hello文件建立一个硬链接,链接名为hello.hard.link

还是指令 ll -li 查看文件inode编号

我们发现hello文件与对应的硬链接的inode编号是一样的,数字由1变成了2,但是软连接并没有改变数字。

 通过对比,我们可以得出结论:

软链接是一个独立的文件,硬链接不是,因为他没有独立的inode编号。

3.什么是软链接

Linux中的软链接与windows系统里桌面的快捷方式是相似的。

这里我们点击桌面快捷方式与在D盘的路径下点击Xshell.exe的效果是一样的,都是打开Xshell这个软件。

这里既然点击快捷方式与运行.exe文件的效果相似那么为什么要有快捷方式呢?

这是因为软件的.exe文件一般都会藏在较深的目录当中,不方便用户查找,因此才有文件的的快捷方式。

这里Linux使用软链接也是因为这个原因。

Linux中软链接的应用场景

这里我们创建一个myproc.c文件,并编写代码,用gcc编译生成可执行文件,这里我们可以直接执行可执行文件。但是在未来公司里做一个项目,并不是一个.exe文件直接暴露出来,他可能把项目以特定的目录文件组织起来的,里面有各种目录与文件。当我们每一次执行可执行程序时,我们还得把他的整体路径全部打出来才可以执行。这里他太挫了,因此这里我们可以直接给.exe文件建立一个软链接,放到与项目目录同一个目录中,这样我们每次执行.exe文件,只需 ./软链接名 即可。

因此我们可以说软链接快速的帮我们定位到了文件。

如:执行test1/test2目录里的myproc。

因此软连接我们可以理解为:

是一个独立的文件,有独立的indoe,软链接内容是指向目标文件的路径。

4.什么是硬链接

这里我们解释硬链接,以inode为切入口。

从上面的实验看:硬链接不是一个独立的文件(没有独立的inode)。这意味着访问硬链接与被链接文件时,访问的是同一个文件。

硬链接的本质是 在指定目录内部的一组映射关系:文件名<->inode的映射关系

以上面创建硬链接为例,这里我们删除hello

 这里我们可以发现:

我们发现数字由2变为了1。

当我们为一个文件创建一个硬链接,再把这个文件删掉,相当于给这个文件重命名。

这里文件并没有并删除(inode还存在),那么什么时候一个文件才会被真正的删除呢?

没有文件名与inode的映射关系。(没有人用)

我们知道文件是保存在磁盘上的,那么对于文件系统来说,他又是怎么知道这个文件没有人用的呢(文件怎么知道没有文件名指向自己)?

这里inode结构体里,有一个int ref_count 成员,用作引用计数:表明有几个文件名映射关系。当我们建立一个硬链接时,不仅会在当前目录里新增一个文件名与inode的映射关系,还会将inode里的引用计数加1。删掉一个文件时,会将文件inode里的引用计数减1,当引用计数为0时,就会将文件真正的删掉。

(注:新建一个文件时,文件inode里的引用计数为1)

同时这里我们还可以解释变化的那个数字是什么:

这里的数字是,硬链接数,记录了有多少个文件名指向对应的inode。

所以硬链接的本质是:

增加一个文件名与inode的映射关系。

5.文件与目录的硬链接数

这里我们新创建一个文件proj,一个新目录newdir,然后查看详细信息:

那么这里为什么新建文件的硬连接数是1,而目录的却是2呢?

这是因为文件就有一个文件名与inode的映射关系。

而对于目录,我们知道目录里有两个隐藏文件:  .  当前目录  ..  上一级目录(注:这里的  .  与  ..  是硬链接)

这里我们发现   .  的inode与newdir的inode是一样,因此对于1446001这个inode编号对应的inode来说有两个文件名与inode的映射关系,所以新建目录的硬链接数为2。同时也说明了为什么  表示当前目录(inode一样)

这里当我们在newdir里再新建一个目录dir:

我们发现硬链接数变为了3.那这是因为什么呢?

这里还是因为目录里的两个隐藏文件:

这里我们可以发现在新建的dir目录里  ..  的inode与newdir的一样,因此,在一个目录(newdir)里新建一个目录(dir),导致多了一个文件名与inode的映射关系,所以该目录(newdir)的硬链接数加1。同时也说明了为什么  ..   是上一级目录(inode一样)   

6.软链接与硬链接的区别

软链接是一个独立的文件,有自己的inode,属性与内用。

而硬链接只是一个文件名与inode的映射关系保存在目录里。

用户无法对目录建立硬链接,可以建立软连接

实验证明:

对根目录建立软链接:

可以看出可以对目录建立链接,里面内容与根目录一样。

对根目录建立硬链接:

建立链接失败。

为什么不能对目录进行建立硬链接:
 

这里我们知道Linux的目录结构是一个多叉树的样子,

如果我们在结尾创建一个硬链接指向根目录。

这里硬链接的所在的目录就多了一个新文件名与根目录inode的映射关系。如果他允许这样子做,那么我们在使用find命令时,我们都要指定路径的,然后会对路径里的文件名与inode进行对应查找,如果当路径中出现硬链接时,就会从硬链接所在目录直接查找到根目录的位置,从而可能形成一个环形结构,导致一直循环的进行查找。因此目录不能进行硬链接。

(注:目录里的  .    ..    是由操作系统设置的指向目录的硬链接,是一个特殊情况。这里是为例方便用户切换到当前目录与上一级目录)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++学习第十一讲---文件操作

文件操作&#xff1a; c中对文件操作需要包含头文件 < fstream > 文本文件&#xff1a;以ASCII码形式储存 二进制文件&#xff1a;以二进制文件储存&#xff08;读不懂&#xff09; 操作文件三大类&#xff1a; 读&#xff1a;ifstream ; 写&#xff1a;ofstream ; 读…

NodeJs 第二十一章 模版引擎

模板引擎是一种用于生成动态网页的工具。它将静态的模板文件与动态的数据源相结合&#xff0c;生成最终的网页。模板引擎通常用于Web开发中&#xff0c;可以方便地将数据动态地插入到页面中&#xff0c;从而生成具有动态内容的网页。 模板引擎的核心功能是数据绑定和逻辑控制。…

GPT-4 的决策在股市中进行量化投资

论文题目:Can Large Language Models Beat Wall Street? Unveiling the Potential of AI in Stock Selection 论文链接:https://arxiv.org/abs/2401.03737 博客地址:https://www.marketsense-ai.com/ 从本质上来说&#xff0c;股票选择是个价格发现机制&#xff0c;在股票投…

JAVA:OFD Reader Writer 开源库技术解析

1、简述 OFD Reader & Writer 是一个由开源社区推动的 OFD 文件处理库&#xff0c;它旨在提供对 OFD 格式文件的读取和写入功能。这一开源项目为开发者提供了强大而灵活的工具&#xff0c;使得在应用程序中处理和生成 OFD 文件变得更加容易和高效 开源地址&#xff1a;htt…

【开源】基于JAVA语言的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

【江科大】STM32:定时器中断

文章目录 TIM&#xff08;Timer&#xff09;定时器根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型基本定时器通用定数器 高级定时器 时钟&#xff08;时钟电路&#xff09;的作用是什么&#xff1a;设置定时器触发中断普通方法&#xff1a;预分频器时序…

《WebKit 技术内幕》学习之九(2): JavaScript引擎

2 V8引擎 2.1 基础 V8是一个开源项目&#xff0c;也是一个JavaScript引擎的实现。它最开始是由一些语言方面的专家设计出来的&#xff0c;后被Google收购&#xff0c;成为了JavaScript引擎和众多相关技术的引领者。其目的很简单&#xff0c;就是为了提高性能。因为在当时之前…

FastDFS分布式文件存储

为什么会有分布式文件系统&#xff1f; 分布式文件系统是面对互联网的需求而产生。因为互联网时代要对海量数据进行存储。很显然靠简单的增加硬盘个数已经满足不了我们的要求。因为硬盘传输速度有限但是数据在急剧增长&#xff0c;另外我们还要要做好数据备份、数据安全等。采用…

Vue2中CesiumV1.113.0加载离线地图

Vue2中CesiumV1.113.0加载离线地图&#xff0c;本文以天地图为例。 1.使用nodejs获取天地图 新建nodejsdownmap项目文件夹&#xff0c;初始化项目 npm init -y src/index.js // An highlighted block var Bagpipe require(bagpipe) var fs require("fs"); var r…

Kafka-服务端-日志存储

基本概念 首先需要了解的是&#xff0c;Kafka使用日志文件的方式保存生产者发送的消息。每条消息都有一个offset值来表示它在分区中的偏移量&#xff0c;这个offset值是逻辑值&#xff0c;并不是消息实际存放的物理地址。 offset值类似于数据库表中的主键&#xff0c;主键唯一…

【GitHub项目推荐--中国 Web 开发者路线图】【转载】

中国 Web 开发者路线图 在你学技术进阶的路上&#xff0c;如果你对接下来要学习的内容感到困惑&#xff0c;可以看看这个开源项目&#xff0c;这是中国 Web 开发者路线图。 它会让你对技术全景有一个了解&#xff0c;并在为你提供指导&#xff0c;该路线图并不会鼓励你选择时…

【GitHub项目推荐--基于 Flutter 的游戏引擎】【转载】

Flame 引擎的目的是为使用 Flutter 开发的游戏会遇到的常见问题提供一套完整的解决方案。 目前 Flame 提供了以下功能&#xff1a; 游戏循环 (game loop) 组件/对象系统 (FCS) 特效与粒子效果 碰撞检测 手势和输入支持 图片、动画、精灵图 (sprite) 以及精灵图组 一些简化…