【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索

news2024/11/26 16:34:16

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】

目录

1、软硬链接

1.1、见一见

1.2、特征

1.3、什么是软硬链接?有什么用(为什么)?

 2、动态库和静态库

2.1、什么是动静态库


1、软硬链接

1.1、见一见

软链接

命令演示一

[jkl@host link]$ touch file_target1.txt # 创建普通文件
[jkl@host link]$ ln -s file_target1.txt file_soft.link # 将link文件软链接到txt文件上
[jkl@host link]$ ll 
total 0
lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:30 file_soft.link -> file_target1.txt
-rw-rw-r-- 1 jkl jkl  0 Sep  5 15:30 file_target1.txt
[jkl@host link]$ ll -i
total 0
1704523 lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:30 file_soft.link -> file_target1.txt
1704522 -rw-rw-r-- 1 jkl jkl  0 Sep  5 15:30 file_target1.txt

运行结果 

  • ln -s:ln ---> link(链接);-s ---> soft(软)   后者链接前者。
  • 两个文件都是独立的文件,因为都有各自的inode编号。

 命令演示二

[jkl@host link]$ ll
total 0
lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:30 file_soft.link -> file_target1.txt
-rw-rw-r-- 1 jkl jkl  0 Sep  5 15:30 file_target1.txt
[jkl@host link]$ rm file_soft.link
[jkl@host link]$ ll
total 0
-rw-rw-r-- 1 jkl jkl 0 Sep  5 15:30 file_target1.txt
[jkl@host link]$ ln -s file_target1.txt file_soft.link
[jkl@host link]$ ll
total 0
lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:40 file_soft.link -> file_target1.txt
-rw-rw-r-- 1 jkl jkl  0 Sep  5 15:30 file_target1.txt
[jkl@host link]$ rm file_target1.txt
[jkl@host link]$ ll
total 0
lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:40 file_soft.link -> file_target1.txt

运行结果

  • 删除软连接的文件对目标文件没影响,但是目标文件删除之后,软连接的文件就没用了。
  • 删除目标文件,可以 rm 或者 unlink 后面跟要删除的连接文件名,这两个命令可以删除目标文件。

硬链接

命令演示

[jkl@host link]$ touch file_target2.txt # 创建普通文件
[jkl@host link]$ ln file_target2.txt file_hard.link # 硬链接文件
[jkl@host link]$ ll
total 0
-rw-rw-r-- 2 jkl jkl  0 Sep  5 15:51 file_hard.link
lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:40 file_soft.link -> file_target1.txt
-rw-rw-r-- 1 jkl jkl  0 Sep  5 15:48 file_target1.txt
-rw-rw-r-- 2 jkl jkl  0 Sep  5 15:51 file_target2.txt
[jkl@host link]$ ll -i
total 0
1704524 -rw-rw-r-- 2 jkl jkl  0 Sep  5 15:51 file_hard.link
1704523 lrwxrwxrwx 1 jkl jkl 16 Sep  5 15:40 file_soft.link -> file_target1.txt
1704522 -rw-rw-r-- 1 jkl jkl  0 Sep  5 15:48 file_target1.txt
1704524 -rw-rw-r-- 2 jkl jkl  0 Sep  5 15:51 file_target2.txt

运行结果 

  • 不是独立的文件,因为没有独立的inode编号 

1.2、特征

  • 1. 软链接是一个独立的文件,因为有独立的inode编号 -> 软连接的内容:目标文件所对应的路径字符串 -> 类似于windows中的快捷方式
  • 硬链接不是一个独立的文件,因为没有独立的inode编号,用的是目标文件的inode。硬链接是什么?-> 硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定的目录下,添加一个新的文件名和inode编号的映射关系!
  • 属性中有一列硬链接数 <=> 文件的磁盘引用计数:有多少个文件名字符串通过inode编号指向inode。

定位一个文件的两种方式:

  • 1、通过路径,最终还是要通过inode number查找    -> 软链接。
  • 2、直接找目标文件的inode number  -> 硬链接。

1.3、什么是软硬链接?有什么用(为什么)?

硬链接

硬链接通过索引节点(inode)来进行连接的。在Linux的文件系统中,每个文件都有一个唯一的索引节点号,而硬链接就是多个文件名指向同一个索引节点。这意味着,尽管文件名不同,但它们都指向磁盘上的同一块数据。

软链接(快捷方式)

软链接,也称为符号链接,是一个特殊类型的文件,它包含了对另一个文件或目录的引用。这个引用可以是一个路径,通过这个路径可以访问到目标文件或目录。软链接类似于Windows中的快捷方式,但它是一个独立的文件,不包含目标文件的数据,只包含对目标文件的引用。

为什么要有软链接?

  • 1. 软链接可以将一个文件或目录的访问路径重定向到另一个位置。这可以方便地将文件或目录放置在不同的位置,同时仍然可以通过统一的路径进行访问
  • 2. 软链接可以用来简化文件或目录的路径

讲解为什么要有硬链接之前先看一段命令

命令演示

[jkl@host link]$ ll -ai
total 12
1704521 drwxrwxr-x  3 jkl jkl 4096 Sep  5 16:47 .
1444333 drwxrwxr-x 19 jkl jkl 4096 Sep  5 15:28 ..
1704525 drwxrwxr-x  3 jkl jkl 4096 Sep  5 16:52 dir
[jkl@host link]$ ll dir -ai
total 12
1704525 drwxrwxr-x 3 jkl jkl 4096 Sep  5 16:52 .
1704521 drwxrwxr-x 3 jkl jkl 4096 Sep  5 16:47 ..
1704526 drwxrwxr-x 2 jkl jkl 4096 Sep  5 16:52 otherdir
[jkl@host link]$ ll dir/otherdir -ai
total 8
1704526 drwxrwxr-x 2 jkl jkl 4096 Sep  5 16:52 .
1704525 drwxrwxr-x 3 jkl jkl 4096 Sep  5 16:52 ..

运行结果 

为什么要有硬链接? 

  1. 构建Linux的路径结构,让我们可以使用一个点和两个点来进行路径定位;
  2. 一般用硬链接来做文件备份。

 注意:

Linux系统中,不允许给目录建立硬链接 -> 避免形成路径环绕。

为什么又给. ..这样的目录设置硬链接呢???

可以理解为特殊情况。文件名是固定的,所有的系统指令在设定的时候都知道. ..是在干什么。

任何一个目录,刚开始新建的时候,引用计数(硬链接数)一定是2。

命令演示

[jkl@host link]$ mkdir dir1
[jkl@host link]$ mkdir dir2
[jkl@host link]$ mkdir dir3
[jkl@host link]$ ll -d dir1 dir2 dir3
drwxrwxr-x 2 jkl jkl 4096 Sep  5 17:58 dir1
drwxrwxr-x 2 jkl jkl 4096 Sep  5 17:59 dir2
drwxrwxr-x 2 jkl jkl 4096 Sep  5 17:59 dir3

运行结果 

在一个目录A中新建一个目录,引用计数会加+1,因为新建目录的..目录指向它,一个目录内部有几个目录:A引用计数 -2 

命令演示

[jkl@host link]$ ll dir -di
1704525 drwxrwxr-x 3 jkl jkl 4096 Sep  5 16:52 dir
[jkl@host link]$ cd dir
[jkl@host dir]$ mkdir dir1
[jkl@host dir]$ ll dir1 -di
1704530 drwxrwxr-x 2 jkl jkl 4096 Sep  5 18:03 dir1
[jkl@host dir]$ cd ..
[jkl@host link]$ ll dir -di
1704525 drwxrwxr-x 4 jkl jkl 4096 Sep  5 18:03 dir

运行结果 

补充:
下面解释一下文件的三个时间(acm):

  • Access 最后访问时间
  • Modify 文件内容最后修改时间
  • Change 属性最后修改时间

 2、动态库和静态库

2.1、什么是动静态库

Linux系统

  • 静态库(后缀.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

Windows系统

  • 静态库(后缀为.lib)
  • 动态库(后缀为.dll)

我们有没有用过库呢???

用过,C/C++标准库 -> strerror strstr strlen / vector list stack ...

‌ldd命令‌是‌Linux中用于显示可执行文件或共享库所依赖的共享库的工具。它可以帮助开发者和管理员确保程序能够找到和链接到正确的共享库版本。 

C语言代码

[jkl@host lib]$ vim test.c
[jkl@host lib]$ gcc test.c
[jkl@host lib]$ ./a.out
hello linux
[jkl@host lib]$ ldd ./a.out
	linux-vdso.so.1 =>  (0x00007ffe3adfe000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f1f7adec000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f1f7b1ba000)
[jkl@host lib]$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Mar 23  2023 /lib64/libc.so.6 -> libc-2.17.so

运行结果 

 C++代码

[jkl@host lib]$ vim test.cc
[jkl@host lib]$ g++ test.cc
[jkl@host lib]$ ./a.out
hahaha
[jkl@host lib]$ ldd a.out
	linux-vdso.so.1 =>  (0x00007ffd18bf5000)
	libstdc++.so.6 => /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6 (0x00007f2448cb6000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f24489b4000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f244879e000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f24483d0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f2449037000)
[jkl@host lib]$ ll /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6
-rwxrwxr-x 1 jkl jkl 11404264 May 30 15:32 /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6
[jkl@host lib]$ ll /usr/lib64/libstdc++.so.6
lrwxrwxrwx 1 root root 19 Jan  8  2021 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19

运行结果 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Vim 到 VSCode:提升远程开发效率的秘密武器

1.前言 在 Linux 服务器上进行开发时&#xff0c;我们常常会选择使用 vi 或 vim 这些轻量级的编辑器。虽然它们可以满足基本的编辑需求&#xff0c;但在处理大型项目时&#xff0c;局限性很明显&#xff1a;缺乏现代编辑器的高级功能&#xff0c;比如语法高亮、代码补全以及便…

windows 调整虚拟内存文件大小,释放C盘

Windows 虚拟内存文件&#xff08;通常是 pagefile.sys&#xff09;的作用是充当物理内存&#xff08;RAM&#xff09;的扩展&#xff0c;当系统内存不足时&#xff0c;它为系统提供一个额外的、基于硬盘的存储空间。这种虚拟内存的机制帮助系统在物理内存耗尽时仍能继续运行程…

数据结构 ——— 单链表oj题:相交链表(链表的共节点)

目录 题目要求 手搓两个相交简易链表 代码实现 题目要求 两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点&#xff0c;如果两个链表不存在相交节点&#xff0c;则返回 NULL 手搓两个相交简易链表 代码演示&#xff1a; struct Lis…

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器&#xff1a; &#xff08;认证&#xff09;UsernamePasswordAuthenticationFilter:负责处理…

LabVIEW提高开发效率技巧----状态保存与恢复

在LabVIEW开发中&#xff0c;保存和恢复程序运行时的状态是一个关键技巧&#xff0c;特别是在涉及需要暂停或恢复操作的应用中。通过使用 Flatten To String 和 Unflatten From String 函数&#xff0c;开发人员可以将程序当前的状态转换为字符串并保存&#xff0c;再在需要时恢…

Vue入门-指令修饰符-事件修饰符

事件修饰符 事件名.stop ->阻止冒泡 demo&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

【Redis】Set类型常用命令

目录 一. Set集合类型简介.二. 增加元素相关命令2.1 向集合中添加元素(sadd)2.2 从集合中移动元素( smove ) 三. 查询元素相关操作.3.1 查询集合中存在的所有元素.( smembers )3.2 查询集合中是否存在member( sismember ) 四. 随机获取集合中的元素4.1 随机获取集合中的n个元素…

LabVIEW中的非阻塞定时器

在LabVIEW编程中&#xff0c;通常需要在某些任务执行过程中进行非阻塞的延时操作。例如&#xff0c;显示某条信息一段时间&#xff0c;同时继续执行其他任务&#xff0c;并在延时时间结束后停止显示该信息。这类需求通常用于处理优先级不同的信息显示&#xff0c;如错误信息需要…

2024双十一买啥最划算?四款必入的数码好物推荐!

随着2024年双十一购物狂欢节的临近&#xff0c;各大电商平台纷纷推出了一系列令人期待的优惠活动&#xff0c;这无疑是一年中最佳的采购时机。对于追求科技潮流与实用主义的消费者而言&#xff0c;选择在这个时候入手心仪已久的数码产品无疑是明智之举。为了帮助大家抓住这波促…

Windows系统操作技巧

文章目录 I 打开‌任务管理器II Windows的run功能常用命令RDP协议的远程连接I 打开‌任务管理器 ‌通过快捷键打开‌任务管理器 ‌[Ctrl + Shift + Esc]:这是最常用的方法,直接按下这三个键即可快速打开任务管理器。‌Ctrl + Alt + Delete‌:按下这三个键后会弹出一个菜单,…

PostgreSQL数据库定期清理归档(pg_wal)日志

一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中&#xff0c;设置archive_command参数&#xff0c;指定一个shell命令来处理归档日志&#xff0c;例如&#xff1a; archive_command cp %p /home/…

中英文在线翻译工具大盘点

中英文在线翻译工具如同语言世界的桥梁&#xff0c;连接着两种不同的文化和语言体系。接下来&#xff0c;让我们一同走进这个精彩纷呈的中英文在线翻译工具集锦&#xff0c;探寻它们的奥秘与魅力。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这款在线翻…

Git的基本使用入门

参考&#xff1a;Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区&#xff0c;也叫 Working Directory暂存区&#xff0c;也叫 stage&#xff0c;index版本库&#xff0c;也叫本地仓库&#xff0c;commit History 将代码推…

书店系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;图书管理&#xff0c;论坛信息管理&#xff0c;用户管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;论坛信息&…

(六)、CT中的滤光片

在X射线中衰减是吸收和散射的结果。X射线可以由于光电效应而衰减&#xff0c;也可以由于康普顿效应而衰减和散射。长波长X射线对CT图像形成的贡献不显著&#xff0c;但会增加患者的剂量&#xff0c;总体的来讲就是要保留穿透能力强的X光。 光电效应是指当光子与物质中的原子相互…

springboot宠物托管平台-计算机毕业设计源码82186

摘要 随着人们生活水平的提高&#xff0c;宠物已经成为越来越多家庭的重要成员。然而&#xff0c;由于工作、旅行等原因&#xff0c;宠物主人在某些时候可能无法亲自照顾宠物&#xff0c;因此宠物托管服务应运而生。本文旨在设计并实现一个基于Spring Boot框架的宠物托管平台&a…

YOLOv8模型改进 第六讲 添加多尺度卷积注意力模块(MSCAM)

在计算机视觉领域&#xff0c;目标检测的准确性和效率是研究的热点之一。YOLOv8 作为最新一代的实时目标检测模型&#xff0c;已经在多个基准数据集上展示了其优越的性能。然而&#xff0c;随着数据集和应用场景的复杂性增加&#xff0c;如何进一步提升模型的检测精度和鲁棒性仍…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

用户代理样式表:你真的了解它吗?

引言 作为一名前端开发者&#xff0c;你是否曾经遇到过这样的情况&#xff1a;明明CSS代码写得一模一样&#xff0c;但是在不同的浏览器上呈现出的效果却大相径庭&#xff1f;这背后的原因&#xff0c;很大程度上要归结于所谓的“用户代理样式表”。 用户代理样式表&#xff…

TY1801 内置GaN电源芯片(18w-65w)

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801内置 GaN 功率管,具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,TY1801不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…