文章目录
- Linux嵌入式开发——连接文件
- ln命令
- 硬连接
- 符号连接(软连接)
Linux嵌入式开发——连接文件
Linux有两种连接文件:第一种叫符号连接也称为软连接,第二种就是硬链接。符号连接类似Windows下的快捷方式,或者说是一个指针。而硬链接则通过文件系统的 inode 连接来产生新文件名,而不是产生新文件,就相当于文件的分身,共用同一个ID。或者说,是共用一块内存区域的对象。我们下面有一个对于inode的简单介绍,具体的介绍大家可以自行查找资料。
inode:记录文件属性,一个文件只有一个inode。inode相当于文件ID,查找文件的时候要先找到inode,然后才能读出文件的内容。
ln命令
ln命令就是用于创建连接文件,我们先输入如下命令去查看一下in命令的帮助信息。
代码语言:javascript复制ln --help
这是有关用法的介绍:
- 用法:ln [选项]… [-T] 目标 链接名
- 或:ln [选项]… 目标
- 或:ln [选项]… 目标… 目录
- 或:ln [选项]… -t 目录 目标…
这是有关具体功能的介绍:
代码语言:javascript复制 --backup[=CONTROL] # 为每个已存在的目标文件创建备份文件
-b # 类似--backup,但不接受任何参数
-d, -F, --directory # 允许超级用户尝试创建指向目录的硬链接
# (注意:此操作可能因系统限制而失败)
-f, --force # 强行删除任何已存在的目标文件
-i, --interactive # 删除目标文件前进行确认
-L, --logical # 如目标为符号链接,本次创建链接时将其解引用
-n, --no-dereference # 如果给定<链接名>是一个链接至某目录的符号链接,
-P, --physical # 创建直接指向符号链接文件的硬链接
-r, --relative # 创建相对于链接位置的符号链接
-s, --symbolic # 创建符号链接而非硬链接
-S, --suffix=后缀 # 自行指定备份文件的后缀
-t, --target-directory=目录 # 在指定<目录>中创建链接
-T, --no-target-directory # 总是将给定的<链接名>当作普通文件
-v, --verbose # 列出每个链接的文件名称
--help # 显示此帮助信息并退出
--version # 显示版本信息并退出
我们主要需要注意的就是下面这两个命令:
-s 创建符号连接(软连接)
-f 强制创建连接文件,如果目标存在,那么先删除掉目标文件,然后再建立连接文件。
硬连接
硬链接是多个文件都指向同一个inode,就相当于武侠小说中的分身一样,主体死亡,分身不会死亡,而且分身受的伤和获得的宝物,主体也能获得。或者说,是共用一块内存区域的对象。当一个对象删除时,另一个对象也可以使这块区间。当一个对象对这块区间进行修改,另一个对象能访问到的数据也被修改了。硬链接相关的知识点如下:
- 具有相同inode的多个文件互为硬链接文件,创建硬链接相当于文件实体多了入口。
- 对于硬链接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除。
- 根据硬链接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除。
- 不论修改源文件还是连接文件,另一个文件的数据都会被改变。
- 硬连接不能跨文件系统。
- 硬连接不能连接到目录。
因为以上这些限制,所以硬链接其实不常用。我们先来看一下每一条知识点的具体含义吧!
具有相同inode的多个文件互为硬链接文件,创建硬链接相当于文件实体多了入口。
首先第一个,我们先来创建几个硬链接,然后来查看对应的inode吧。首先输入如下命令去创建硬连接:
代码语言:javascript复制ln a a1
ln a a2
然后输入如下命令查看文件的索引编号:
代码语言:javascript复制ll -i a*
结果如下所示:
代码语言:javascript复制1578340 -rwxrwxrwx 3 ygr ygr 15960 1月 18 17:08 a*
1578340 -rwxrwxrwx 3 ygr ygr 15960 1月 18 17:08 a1*
1578340 -rwxrwxrwx 3 ygr ygr 15960 1月 18 17:08 a2*
1574339 -rw-rw-r-- 1 ygr ygr 78 1月 18 17:07 a.c
我们可以看到,这三个经过硬链接的文件的inode是一样的,也就印证了第一条知识点。
代码语言:javascript复制ll 其实就相当于ls -l 的缩写,然后输入ll --help就可以查看到相应的介绍,在这里不再赘述。我们只要知道下面这个命令即可。
-i, --inode # 显示每个文件的索引编号(inode 号)
对于硬链接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除。
那么这个我们如何去理解呢?很简单,我们删除源文件,看一下这些硬链接文件是不是可以被执行。我们输入以下命令来测试一下:
代码语言:javascript复制# 输入
rm a
./a1
# 输出
hello world
根据上面的结果,我们能看到删除源文件之后,我们的硬连接文件还是能够执行。
根据硬链接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除。
这个就很好理解了,毕竟这些文件都是独立的,删除哪一个,另外的都能独立执行。
不论修改源文件还是连接文件,另一个文件的数据都会被改变。
这个的话,就相当于不管是主体还是分身受伤了,整体都会受伤。如果说上面那个是硬连接的独立性,那么这就是硬连接的关联性。我们来具体的看一下到底是怎么回事:
首先,我们给a.c创建一个硬连接,然后修改这个硬连接文件,看一下源文件会不会被修改。具体做法如下所示:
代码语言:javascript复制# 创建硬连接文件
ln a.c a1.c
# 编辑硬连接文件
gedit a1.c
具体修改如下所示:
代码语言:javascript复制// 修改前
#include <stdio.h>
int main (void){
printf("hello worldrn");
return 0;
}
// 修改后
#include <stdio.h>
int main (void){
printf("hello worldrn");
printf("hello chenyirn");
return 0;
}
我们打开源文件看一下,发现也发生了变化。
代码语言:javascript复制#include <stdio.h>
int main (void){
printf("hello worldrn");
printf("hello chenyirn");
return 0;
}
符号连接(软连接)
接下来我们来看一下符号连接,符号连接类似Windows下的快捷方式,符号链接也叫做软连接,软连接要用的多。符号连接相当于创建了一个独立的文件,这个文件会让数据读取指向它连接的哪个文件的文件名。软连接的特点如下所示:
- 可以连接到目录。
- 可以跨文件系统。
- 删除源文件以后,软连接文件也就“打不开了”。
- 符号连接文件通过->来指示具体的连接文件。
- 符号连接要使用绝对路径,否则连接会出问题。
有些同学可能发现不用绝对路径也能成功,但是在一些特殊的场景是不行的,比如跨文件的操作时,就会出问题,所以还是建议使用绝对路径。
我们来介绍一下具体的使用方法:
代码语言:javascript复制# 创建软连接
ln -s /home/ygr/a a1
# 查看
ll -i a*
# 查看结果
1574003 -rwxrwxr-x 1 ygr ygr 15960 1月 20 16:57 a*
1578337 lrwxrwxrwx 1 ygr ygr 11 1月 20 17:09 a1 -> /home/ygr/a*
1574339 -rw-rw-r-- 1 ygr ygr 107 1月 20 16:47 a.c
# 执行复制操作
cp -d a1 test1
# 执行复制操作结果
a1
复制操作结果说明成功把快捷方式移入到了另一个文件夹里面,这是不加绝对路径做不到的。
删除源文件之后软连接便无法执行其实很好理解,你把exe 文件删除了,那么快捷方式自然无法打开。或者说,你把指针指向的地址内容清除了,指针自然找不到内容。