zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux嵌入式开发——连接文件

2023-03-07 09:06:50 时间

文章目录

Linux嵌入式开发——连接文件

Linux有两种连接文件:第一种叫符号连接也称为软连接,第二种就是硬链接。符号连接类似Windows下的快捷方式,或者说是一个指针。而硬链接则通过文件系统的 inode 连接来产生新文件名,而不是产生新文件,就相当于文件的分身,共用同一个ID。或者说,是共用一块内存区域的对象。我们下面有一个对于inode的简单介绍,具体的介绍大家可以自行查找资料。

inode:记录文件属性,一个文件只有一个inode。inode相当于文件ID,查找文件的时候要先找到inode,然后才能读出文件的内容。

ln命令

ln命令就是用于创建连接文件,我们先输入如下命令去查看一下in命令的帮助信息。

ln --help

这是有关用法的介绍:

  • 用法:ln [选项]… [-T] 目标 链接名
  • 或:ln [选项]… 目标
  • 或:ln [选项]… 目标… 目录
  • 或:ln [选项]… -t 目录 目标…

这是有关具体功能的介绍:

   --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,就相当于武侠小说中的分身一样,主体死亡,分身不会死亡,而且分身受的伤和获得的宝物,主体也能获得。或者说,是共用一块内存区域的对象。当一个对象删除时,另一个对象也可以使这块区间。当一个对象对这块区间进行修改,另一个对象能访问到的数据也被修改了。硬链接相关的知识点如下:

  1. 具有相同inode的多个文件互为硬链接文件,创建硬链接相当于文件实体多了入口。
  2. 对于硬链接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除。
  3. 根据硬链接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除。
  4. 不论修改源文件还是连接文件,另一个文件的数据都会被改变。
  5. 硬连接不能跨文件系统。
  6. 硬连接不能连接到目录。

因为以上这些限制,所以硬链接其实不常用。我们先来看一下每一条知识点的具体含义吧!


具有相同inode的多个文件互为硬链接文件,创建硬链接相当于文件实体多了入口。

首先第一个,我们先来创建几个硬链接,然后来查看对应的inode吧。首先输入如下命令去创建硬连接:

ln a a1
ln a a2

然后输入如下命令查看文件的索引编号:

ll -i a*

结果如下所示:

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是一样的,也就印证了第一条知识点。

ll 其实就相当于ls -l 的缩写,然后输入ll --help就可以查看到相应的介绍,在这里不再赘述。我们只要知道下面这个命令即可。

-i, --inode            # 显示每个文件的索引编号(inode 号)

对于硬链接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除。

那么这个我们如何去理解呢?很简单,我们删除源文件,看一下这些硬链接文件是不是可以被执行。我们输入以下命令来测试一下:

# 输入
rm a
./a1

# 输出
hello world

根据上面的结果,我们能看到删除源文件之后,我们的硬连接文件还是能够执行。


根据硬链接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除。

这个就很好理解了,毕竟这些文件都是独立的,删除哪一个,另外的都能独立执行。


不论修改源文件还是连接文件,另一个文件的数据都会被改变。

这个的话,就相当于不管是主体还是分身受伤了,整体都会受伤。如果说上面那个是硬连接的独立性,那么这就是硬连接的关联性。我们来具体的看一下到底是怎么回事:

首先,我们给a.c创建一个硬连接,然后修改这个硬连接文件,看一下源文件会不会被修改。具体做法如下所示:

# 创建硬连接文件
ln a.c a1.c

# 编辑硬连接文件
gedit a1.c

具体修改如下所示:

// 修改前
#include <stdio.h>
int main (void){
	printf("hello world\r\n");
	return 0;
}

// 修改后
#include <stdio.h>
int main (void){
	printf("hello world\r\n");
	printf("hello chenyi\r\n");
	return 0;
}

我们打开源文件看一下,发现也发生了变化。

#include <stdio.h>
int main (void){
	printf("hello world\r\n");
	printf("hello chenyi\r\n");
	return 0;
}

符号连接(软连接)

接下来我们来看一下符号连接,符号连接类似Windows下的快捷方式,符号链接也叫做软连接,软连接要用的多。符号连接相当于创建了一个独立的文件,这个文件会让数据读取指向它连接的哪个文件的文件名。软连接的特点如下所示:

  1. 可以连接到目录。
  2. 可以跨文件系统。
  3. 删除源文件以后,软连接文件也就“打不开了”。
  4. 符号连接文件通过->来指示具体的连接文件。
  5. 符号连接要使用绝对路径,否则连接会出问题。

有些同学可能发现不用绝对路径也能成功,但是在一些特殊的场景是不行的,比如跨文件的操作时,就会出问题,所以还是建议使用绝对路径。

我们来介绍一下具体的使用方法:

# 创建软连接
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 文件删除了,那么快捷方式自然无法打开。或者说,你把指针指向的地址内容清除了,指针自然找不到内容。