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

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  118 17:08 a*
1578340 -rwxrwxrwx 3 ygr ygr 15960  118 17:08 a1*
1578340 -rwxrwxrwx 3 ygr ygr 15960  118 17:08 a2*
1574339 -rw-rw-r-- 1 ygr ygr    78  118 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  120 16:57 a*
1578337 lrwxrwxrwx 1 ygr ygr    11  120 17:09 a1 -> /home/ygr/a*
1574339 -rw-rw-r-- 1 ygr ygr   107  120 16:47 a.c

# 执行复制操作
cp -d a1 test1

# 执行复制操作结果
a1

复制操作结果说明成功把快捷方式移入到了另一个文件夹里面,这是不加绝对路径做不到的。


删除源文件之后软连接便无法执行其实很好理解,你把exe 文件删除了,那么快捷方式自然无法打开。或者说,你把指针指向的地址内容清除了,指针自然找不到内容。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源大于15MB分2次上传。 清晰度一般。加到11章 第12,13章没有。 第1章 嵌入式系统基础. 1.1 嵌入式系统简介 1.1.1 嵌入式系统定义 1.1.2 嵌入式系统与PC 1.1.3 嵌入式系统的特点 1.2 嵌入式系统的发展 1.2.1 嵌入式系统现状 1.2.2 嵌入式系统发展趋势 1.3 嵌入式操作系统与实时操作系统 1.3.1 Linux 1.3.2 uC/OS 1.3.3 Windows CE 1.3.4 VxWorks 1.3.5 Palm OS 1.3.6 QNX 1.4 嵌入式系统选型 第2章 基于ARM9处理器的硬件开发平台 2.1 ARM处理器简介 2.1.1 ARM公司简介 2.1.2 ARM微处理器核 .2.2 ARM9微处理器简介 2.2.1 与ARM7处理器的比较 2.2.2 三星S3C2410X处理器详解 2.3 FS2410开发平台 第3章 创建嵌入式系统开发环境 3.1 嵌入式Linux的开发环境 3.2 Cygwin 3.3 虚拟机 3.4 交叉编译的预备知识 3.4.1 Make命令和Makefile文件 3.4.2 binutils工具包 3.4.3 gcc编译器 3.4.4 Glibc库 3.4.5 GDB 3.5 交叉编译 3.5.1 创建编译环境 3.5.2 编译binutils 3.5.3 编译bootstrap_gcc 3.5.4 编译Glibc 3.5.5 编译完整的gcc 3.5.6 编译GDB 3.5.7 成果 3.5.8 其他交叉编译方法 3.6 通过二进制软件包创建交叉编译环境 3.7 开发套件 第4章 调试嵌入式系统程序 4.1 嵌入式系统调试方法 4.1.1 实时在线仿真 4.1.2 模拟调试 4.1.3 软件调试 4.1.4 BDM/JTAG调试 4.2 ARM仿真器 4.2.1 techorICE ARM仿真器 4.2.2 ARM仿真器工作原理 4.2.3 ARM仿真器的系统功能层次 4.2.4 使用仿真器和ADS Debugger调试ARM开发板 4.3 JTAG接口 4.3.1 JTAG引脚定义 4.3.2 通过JTAG烧写Flash 4.3.3 烧写Flash技术内幕 第5章 Bootloader 5.1 嵌入式系统的引导代码 5.1.1 初识Bootloader 5.1.2 Bootloader的启动流程 5.2 Bootloader之vivi 5.2.1 vivi简介 5.2.2 vivi的配置与编译 5.2.3 vivi代码导读 5.3 Bootloader之U-Boot 5.3.1 U-Boot代码结构分析 5.3.2 编译U-Boot代码 5.3.3 U-Boot代码导读 5.3.4 U-Boot命令 5.4 FS2410的Bootloader 第6章 Linux系统在ARM平台的移植 6.1 移植的概念 6.2 Linux内核结构 6.3 Linux-2.4内核向ARM平台的移植 6.3.1 根目录 6.3.2 arch目录 6.3.3 arch/arm/boot目录 6.3.4 arch/arm/def-configs目录 6.3.5 arch/arm/kernel目录 6.3.6 arch/arm/mm目录 6.3.7 arch/arm/mach-s3c2410目录 6.4 Linux-2.6内核向ARM平台的移植 6.4.1 定义平台和编译器 6.4.2 arch/arm/mach-s3c2410/devs.c 6.4.3 arch/arm/mach-s3c2410/mach-fs2410.c 6.4.4 串口输出 6.5 编译Linux内核 6.5.1 代码成熟等级选项 6.5.2 通用的一些选项 6.5.3 和模块相关的选项 6.5.4 和块相关的选项 6.5.5 和系统类型相关的选项 6.5.6 和总线相关的选项 6.5.7 和内核特性相关的选项 6.5.8 和系统启动相关的选项 6.5.9 和浮点运算相关的选项 6.5.10 用户空间使用的二进制文件格式的选项 6.5.11 和电源管理相关的选项 6.5.12 和网络协议相关的选项 6.5.13 和设备驱动程序相关的选项 6.5.14 和文件系统相关的选项 6.5.15 和程序性能分析相关的选项 6.5.16 和内核调试相关的选项 6.5.17 和安全相关的选项 6.5.18 和加密算法相关的选项 6.5.19 库选项 6.5.20 保存内核配置 第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 第8章 网络设备驱动程序开发 8.1 网络设备驱动程序简介 8.1.1 device数据结构 8.1.2 sk_buff数据结构 8.1.3 内核的驱动程序接口 8.2 以太网控制器CS8900A 8.2.1 特性 8.2.2 工作原理 8.2.3 电路连接 8.2.4 引脚 8.2.5 操作模式 8.3 网络设备驱动程序实例 8.3.1 初始化函数 8.3.2 打开函数 8.3.3 关闭函数 8.3.4 发送函数 8.3.5 接收函数 8.3.6 中断处理函数 第9章 USB驱动程序开发 9.1 USB驱动程序简介 9.1.1 USB背景知识 9.1.2 Linux内核对USB规范的支持 9.1.3 OHCI简介 9.2 Linux下USB系统文件结点 9.3 USB主机驱动结构 9.3.1 USB数据传输时序 9.3.2 USB设备连接/断开时序 9.4 主要数据结构及接口函数 9.4.1 数据传输管道 9.4.2 统一的USB数据传输块 9.4.3 USBD数据描述 9.4.4 USBD与HCD驱动程序接口 9.4.5 USBD层的设备管理 9.4.6 设备类驱动与USBD接口 9.5 USBD文件系统接口 9.5.1 设备驱动程序访问 9.5.2 设备拓扑访问 9.5.3 设备信息访问 9.6 设备类驱动与文件系统接口 9.7 USB HUB驱动程序 9.7.1 HUB驱动初始化 9.7.2 HUB Probe相关函数 9.8 OHCI HCD实现 9.8.1 OHCI驱动初始化 9.8.2 与USBD连接 9.8.3 OHCI根HUB 9.9 扫描仪设备驱动程序 9.9.1 USBD接口 9.9.2 文件系统接口 9.10 USB主机驱动在S3C2410X平台的实现 9.10.1 USB主机控制器简介 9.10.2 驱动程序的移植 第10章 图形用户接口 10.1 嵌入式系统中的GUI简介 10.1.1 MicroWindows 10.1.2 MiniGUI 10.1.3 Qt/Embedded 10.2 MiniGUI编程 10.2.1 MiniGUI移植 10.2.2 MiniGUI编程 10.3 初识Qt/Embedded 10.3.1 Qt介绍 10.3.2 系统要求 10.3.3 Qt的架构 10.4 Qt/Embedded嵌入式图形开发基础 10.4.1 建立Qt/Embedded 开发环境 10.4.2 认识Qt/Embedded开发环境 10.4.3 窗体 10.4.4 对话框 10.4.5 外形与感觉 10.4.6 国际化 10.5 Qt/Embedded实战演练 10.5.1 安装Qt/Embedded工具开发包 10.5.2 交叉编译Qt/Embedded库 10.5.3 Hello,World 10.5.4 发布Qt/Embedded程序到目标板 10.5.5 添加一个Qt/Embedded应用到QPE 第11章 Java虚拟机的移植 11.1 Java虚拟机概述 11.1.1 Java虚拟机的概念 11.1.2 J2ME 11.1.3 KVM 11.2 Java虚拟机的移植 11.2.1 获得源码 11.2.2 编译环境的建立 11.2.3 JDK的安装 11.2.4 KVM的移植及编译 11.2.5 KVM的测试 11.3 其他可选的虚拟机 11.4 性能优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值