我们今天再来聊一下这个"软硬链接"的问题.
目录
1. 软硬链接长什么样?
可能许多朋友没有见过软连接和硬链接是什么样子, 我们下面用linux系统来稍微演示一下~
首先, 我们新建一个文件来当作链接对象:
我们下面来为这个file.txt文件创建一个软连接和硬链接.
然后我们再来为这个file文件创建一个硬链接文件.
好的, 上面file.hard
和file.soft
就是文件file.txt
的一个硬链接和软连接, 那他们分别有什么特征呢? 我们下面来简单介绍一下:
2. 软连接和硬链接的特征 和 应用
2.1 软连接特征 及其 应用?
①软连接是什么?
首先, 我们看上图, 我们发现:
软连接是一个独立的文件, 他有自己的inode
同时, 我们还可以观察到, cat file.soft
就是file.txt的内容, 所以说file.soft的文件内容就是一串路径, 该路径是链接对象的路径.
该如何理解呢? 这个Linux中的软连接就是我们Windows下的快捷方式, 快捷方式里面就是指向的一个文件啦~
不过软连接这个东西一般用来做什么呢?
当作一个快捷方式使用, 方便的找到一个不好找的文件路径下的文件…
②软连接的应用1: 快捷方式
③软连接的应用2: 方便维护库文件
(来自文小言)当系统中有多个版本的库文件时,可以通过创建软连接来指定当前使用的版本。这样,当需要更新库文件时,只需要修改软连接的指向即可,而不需要修改所有引用该库文件的程序。这样一来,就能很方便地实现不同版本库文件的切换和共存啦!(✿◠‿◠)
我们来举个例子, 我们系统库目录中有很多库吧, 但是一旦升级这些库, 库的名字发生改动, 可能我们就得去修改这个系统库目录, 还有用到这些库的文件可能也需要重新编译, 但是我们如果在系统库里放一些快捷方式(软连接), 这样我们只需要修改软连接的指向即可, 也不需要重新编译了~
(来自文小言)呀,你的理解完全正确呢!(✿◡‿◡) 就像你说的那样,如果在系统库目录里放上一些软连接,就像放上了好多“小路标”一样。当库文件升级或者名字改动的时候,我们只需要动动这些“小路标”,让它们指向新的库文件就好啦!这样,那些用到这些库的程序就能继续开心地运行,不用我们大费周章地重新编译啦~ 是不是很方便呀!(≧▽≦)
2.2 硬连接特征 及其 应用?
那么上面就是软连接的简单介绍了, 我们下面来介绍一下硬链接?
①硬链接是什么?
上面就是一个硬链接, 很显然, 我们通过上图就可以发现:
硬链接不是一个独立的文件, 因为与链接对象的inode一样
那么硬链接究竟是什么东西呢? 首先我们需要说的是硬链接他不是一个独立的文件, 还记得我们之前说过的我们每个独立的文件都有一个自己的inode吗? 我们可以发现我们这个硬链接跟连接目标的inode是一样的. 换句话说, 硬链接file.hard和file.txt对应操作系统而言是等价的, 这俩都是一个文件路径, 操作系统将这个文件路径 与 对应的inode关联起来, 很显然, 这个file.txt所对应的inode被关联了两次, 一次是file.txt另一个是file.hard.
②引用计数?
在我们这个例子中, 我们的inode不是被两个文件路劲同时指向嘛, 所以说呢对应的inode引用计数就是2咯, 当我们删除file.txt的时候, 引用计数就变成1, 当再删除file.hard引用计数变成0的时候, 文件对应的inode内容才会被删除~
③硬链接的应用1: 重命名?
实际上, 我们的重命名就是这个硬链接这个道理.
重命名, 就是重新定义文件名字, 文件名字就是文件路径 + 文件名. 我们可以先把目标文件建立一个硬链接, 然后把原文件删掉, 所以说这就是重命名咯~.
我们下面来做一个简单的实验:
这样做是不是就是重命名操作啦?
⑤硬链接的应用2: 构建linux路径结构, 方便使用.和…进行目录回退~
什么意思呢? 首先目录也是一个文件吧, 然后一个目录的文件引用计数至少是2, 一个是他自己, 另一个是自己目录下的.
, 当然还可能有其他硬链接和..
.
我们根据这个特性, 我们就可以根据一个目录文件的引用计数来计算出一个目录下有多少个子目录了.
目录文件引用计数 = 2 + 子目录文件个数
比如, 我们举个例子, 请看下面/目录
但是, 需要注意的是, 我们并不能给一个目录硬链接.
为什么Linux不允许用户自己为目录定义硬链接呢?
很简单, 加入说我在一个非根目录下定义一个硬链接, 让他是根目录, 那么这个系统就不是一个树结构了, 而是一个树 + 循环结构(一直循环). 因此说Linux不允许这样. 举个比较直观的例子, 假如说Linux的查找文件名的指令如果去这样一个允许目录硬链接的例子去查找某个文件, 基本就是一直循环不会终止了.
为什么Linux自己可以为目录定义硬链接?
这里所说的硬链接指的就是.
和..
, 难道不会发生上面说的文件循环问题吗? 不会, 因为Linux自己弄的这俩硬链接文件名是固定的, 换句话说可以进行特殊处理~
⑥硬链接的应用3: 备份
我们说的这个硬链接备份不是真的备份, 而是让你删掉文件不会真的删掉文件. 换句话说, 不是在电脑里存放两份相同的文件, 而是只存一份, 但是有两个文件路径与对应的inode相关联.
好的, 至此我们基本把软连接和硬链接的基本知识说的差不多了, 我们下面来补充两个小知识点.
拓展1: 所有的文件 = 打开的文件 + 没被打开的文件
所有的文件总共可以分为两大类, 一个是打开的文件, 由操作系统和内存进行管理. 还有一类是没有被打开的文件, 是躺在磁盘中的文件, 由磁盘和文件系统进行管理.
拓展2: 文本写入文件 和 二进制写入文件的理解?
我们C语言读写一个文件, 有两种写入方式, 一种是二进制写入, 另一种是文本写入.
实际上, 这个文本写入是独属于上层语言层的写入方式. 在底层都是二进制写入(对操作系统而言).
(文小言)你说得好对呀!(✿◠‿◠) 确实是这样呢,在C语言里,我们有二进制写入和文本写入这两种方式。不过呀,从操作系统的角度来看,它可不管你是文本还是二进制呢,它都是按照二进制数据来处理文件的哦。
文本写入呢,其实是我们上层语言为了方便人类阅读和编辑文件,而提供的一种更友好的写入方式啦。它会把一些特定的字符转换成我们人类能看懂的格式,比如换行符呀、制表符呀之类的。
而二进制写入呢,就更底层一些啦,它直接把数据按照二进制的形式写入文件,不进行任何转换。这样呢,虽然对人类来说可能不太直观,但是对计算机来说却很方便处理呢。
所以呀,你说得很对,文本写入是独属于上层语言层的写入方式,底层都是二进制写入呢!(≧▽≦)
可能只是说还不太清楚, 我们举个例子.
我们C语言写下下面代码:
int a = 10;
scanf("%d", &a);
printf("%d", a);
显然, 我们在终端中输入字符"123456"都是一些字符而已, 计算机会把这六个字符转换成对应的数字给到a空间, 之后输出的时候, a里面是二进制的数字啊, 所以C语言的printf函数再给我们把数字转换成字符"123456"给我们显示出来~
EOF
标签:文件,软硬,写入,链接,file,linux,我们,连接 From: https://blog.csdn.net/2302_79031646/article/details/144584269