深入理解 Linux 文件系统与动静态库

目录

一、Linux 文件系统中的 inode

二、软硬链接

三、动静态库


在 Linux 系统中,文件系统和动静态库是非常重要的概念。本文将带大家深入了解这些内容,让你在技术之路上更进一步。

一、Linux 文件系统中的 inode

何为文件系统?对计算机中打开和关闭的文件做管理,打开的文件如何管理?之前的文章中讲到了,通过加载到内存,用struct file描述打开的文件; 那没有打开的文件呢?存在磁盘,如何管理,通过inode管理!

inode 是 Linux 文件系统中的一个关键概念。它是文件系统用于索引和管理文件的基本数据结构。每个文件和目录都有一个与之对应的 inode。inode 记录了文件的属性,如文件类型、权限、所有者、大小等,以及文件数据在磁盘上的存储位置。理解 inode 对于理解文件系统的运作至关重要。

查看文件的inode编号:

ls -li

可以看到,第一列的数字就是inode编号

对于单个文件想查看更详细的信息:

stat 文件名

其中文件最重要的属性:inode

如何理解inode?

首先,对于磁盘上的文件如何管理,当然是对磁盘管理了,磁盘如何管理呢?容量太大了,我们分区管理,每个区再分成一个个块组(block group),根据分治的思想,管理好了一个个块组,就管理好了一整个分区,进而管理好了一整个磁盘!

而inode就是块组中很重要的一个概念,每个块组中,都有一个inode Table,其中每一个inode可以看作一个结构体,并给他们编号(返回给上层),结构体内的字段就是文件的属性,当创建一个文件时,就会填充这些结构体字段。

  • Block Group:文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相 同的结构组成。
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了;Super Block是区级的数据,它会随机分配到几个块组中,当Super Block被破坏时,就会找到备份的来恢复数据。
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息,一个块组有一份GDT来描述、管理、记录它本身
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没 有被占用
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。 i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等 数据区:存放文件内容

二、软硬链接

  1. 硬链接:硬链接是指多个文件名指向同一个 inode。它就像是文件的多个别名,删除其中一个文件名并不会影响文件本身。
  2. 软链接:软链接则是一种特殊的文件,它指向另一个文件或目录。软链接可以跨越文件系统,删除源文件会导致软链接失效。

创建硬链接的指令:

ln 被链接的文件 硬链接名

硬链接不是一个独立的文件,创建一个硬链接就相当于在当前目录中增加一条文件名到inode的映射信息,且inode对应文件的硬链接数+1;一个文件的硬链接数为0时,这个文件才真正被删除(用户级);

硬链接的应用:路径切换系统的构建,每个文件夹中的 ... 都是硬链接,来构建出文件路径的切换,但是,这件事上Linux只许州官放火,不许百姓点灯,linux是不允许用户对目录创建硬链接的,这是为了防止文件路径成环

创建软链接:

ln  -s 被链接的文件 软链接名

软链接很类似于Windows中的快捷方式,但是它不同于硬链接,它是一个独立的文件,有属于自己的inode,它的文件内容其实就是:目标文件的文件路径;这样就可以通过打开软链接达到和打开目标文件一样的效果

链接的删除:

可以用rm
但也有专属删除链接的指令:unlink

三、动静态库

  1. 动态库:动态库在程序运行时被动态加载,可以实现代码的共享和复用。它具有灵活性高的优点,但也可能带来一些运行时的复杂性。
  2. 静态库:程序在编译链接的时候把库的代码直接拷贝到可执行文件中。程序运行的时候将不再需要静态库

linux中                                     

动态库:.so

静态库:.a          

Windows中:

动态库:.dll

静态库:.lib

其实无论是动态库还是静态库,都是把一堆源文件编译处理出的.o文件(二进制文件)整理在一起,在加上这些源文件对应的头文件,就是一个完整的库了,这样既隐藏了库的源代码,也能让其他开发者使用这个库的功能

静态库的生成:

gcc -c xxx.c 
ar -rc  lib.a  xxx.o xx.o

先通过gcc的-c选项生成二进制文件,再把所有的二进制文件通过ar命令生成.a文件

得到静态库后,生成可执行程序时把库链接到可执行程序上即可(实际就是拷贝库)

gcc Main.c -I 库的头文件路径 -l 库名 -L 库文件的路径

动态库的生成:

gcc -fPIC -c xxx.c
gcc -shared -o lib.so  xxx.o xx.o

-fPIC选项是为了生成位置无关码

得到了动态库,那么怎么使用呢?

它可不像静态库那样生成可执行程序时直接把库的内容

gcc Main.c -I 库的头文件路径 -l 库名 -L 库文件的路径

此时生成a.out,但是运行时根本不可以运行,需要注意的是,我们使用-I-L-l这三个选项都是在编译期间告诉编译器我们使用的头文件和库文件在哪里以及是谁,但是当生成的可执行程序生成后就与编译器没有关系了,此后该可执行程序运行起来后,操作系统找不到该可执行程序所依赖的动态库,可以使用lld指令查看可执行程序依赖哪些动态库

lld a.out

执行程序所依赖的动态库没有被找到时,有四种处理方法:

  1. 拷贝库文件到系统共享路径下(如centOS的是: /lib64/ )
  2. 更改环境变量: LD_LIBRARY_PATH
  3. 配置/etc/ld.so.conf.d/,

    我们可以通过配置/etc/ld.so.conf.d/的方式解决该问题,/etc/ld.so.conf.d/路径下存放的全部都是以.conf为后缀的配置文件,而这些配置文件当中存放的都是路径,系统会自动在/etc/ld.so.conf.d/路径下找所有配置文件里面的路径,之后就会在每个路径下查找你所需要的库。我们若是将自己库文件的路径也放到该路径下,那么当可执行程序运行时,系统就能够找到我们的库文件了(需要使用ldconfig命令将配置文件更新一下)

  4. 在系统共享路径下,生成库文件的软链接(保存库文件的绝对路径)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fortinet的安全愿景SASO概述

FTNT SASE的独特方法,使其成为一家适应性极强的厂商,能够应对不断变化的网络和网络安全环境。FTNT开发了一种名为Secure Access Service Omni(SASO)的变体,以更准确地反映FTNT在融合网络和安全功能方面的实力。我们预计…

2024 VMware VCP一条龙通关-送题库

VMware VCP-DCV 2024(2V0-21.23)认证考试,2024年可高分通过。 1.5. An administrator has a host profile named Standard-Config. The administrator wants to change the other host profiles to use only the storage configuration setti…

电脑缺失opencl.dll怎么办,轻松解决opencl.dll的多种方法分享

当我们在操作电脑过程中遇到系统提示“由于找不到opencl.dll,无法继续执行代码”,这个错误会导致软件应用无法正常运行。OpenCL.dll作为一个与Open Computing Language(开放计算语言)相关的动态链接库文件,它在执行需要…

pytest教程-43-钩子函数-pytest_report_header

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_runtest_makereport钩子函数的使用方法,本小节我们讲解一下pytest_report_header钩子函数的使用方法。 pytest_report_header 钩子函数允许你在 pytest 的终端报告的头部添…

....comic科学....食用手册....

1.点击链接后,保存漫画至夸克网盘,若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后,长按 漫画文件夹,点击下载,下载速度400K左…

在Linux操作系统中扩建swap容量

在Linux操作系统上创建硬盘分区不仅可以储存数据,还可以使用创建的硬盘分区去扩展机器上swap分区的大小——去扩展交换工具的容量。 有些软件对于swap分区的大小是有要求的,swap分区的大小小于多少就安装不上软件。 要扩展swap容量要么重装系统&#x…

黑啤:浓郁与深邃的完善整合

啤酒的世界丰富多彩,而黑啤作为其中的一种与众不同风格,以其浓郁的口感和深邃的色泽备受瞩目。Fendi club黑啤作为精酿啤酒的代表,将浓郁与深邃完善整合,为消费者带来了与众不同的味蕾盛宴。 首先,Fendi club黑啤在原料…

Zabbix5.0——安装与部署

目录 一、zabbix-server(192.168.206.134) 监控方 1. 环境准备 2.安装zabbix 2.1 准备zabbix-repo 2.2清理缓存 2.3安装zabbix主包(服务器和代理) 2.4安装zabbix前端包 3. 数据库安装 3.1 授权zabbix账号 3.2导入数据库(初始化zabbix&#x…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势,整合市面上主流陪玩app应用功能,自主开发了多客陪玩系统源码,并可为客户提供全部原生陪玩源码,进行二次开发,打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

SpringBoot之Zuul服务

概述 Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤。 目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径,具体位置为 系统->系统信息->高级系统设置->高级->环境…

马化腾用“不负众望”,来评价视为“全村希望”的视频号

我是王路飞。 2023年的视频号,给了腾讯足够的惊喜。 去年一年,视频号电商GMV实现近3倍增长(约为1200亿~1500亿)。2023年三季度,视频号总播放量同比增长超50%; 2023年视频号供给数量同比增长超…

【python】模拟巴特沃斯滤波器

巴特沃斯滤波器(Butterworth Filter),以其设计者斯蒂芬巴特沃斯(Stephen Butterworth)的名字命名,是一种具有平滑频率响应的滤波器。这种滤波器在频域中具有非常平坦的无波纹响应,直到它达到截止…

一文了解CloudXR优势及应用原理

CloudXR是一种新颖而先进的技术,旨在将虚拟现实和增强现实体验从本地设备转移到云端,主要功能也包括了远程渲染、流媒体传输、低延迟、高带宽和高质量的音视频传输。CloudXR(云化XR)可以将高保真度的虚拟现实或增强现实场景实时传…

线程的常见方法

线程的常见方法 休眠: 让当前状态不再参与cpu的竞争,直到休眠结束; 结果:并不是完全交替进行的,因为只是休眠状态,也会存在争抢cpu 放弃: 让当前状态主动放弃时间片,下次再去争抢…

如何在PPT中插入网页?这样操作,免费还高效!

融合课、跨学科课,已经是近两年来教育界的热门词。 在公开课、微课比赛中,不添融合一些较为先进的信息技术,都不好意思拿出手了。 最近,由不坑老师开发制作的Office插件——不坑盒子,实现了在PPT中插入网页&#xff…

[性能优化] ScrollView视图优化为循环列表

问题描述: 原先商城的物品栏中的item 是load在一个scrollView 下,用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件,随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

es使用遇到的bug总结

本来版本7.4.0不行,最后换了个版本7.15.1就可以了,但又出现以下问题了: Beanpublic ElasticsearchClient elasticsearchClient() { // RestClient client RestClient.builder(new HttpHost("localhost", 9200,"http&q…

Duplicate entry ‘asdfg‘ for key ‘clazz.name‘

Mybatis:java.sql.SQLIntegrityConstraintViolationException:Duplicate entry ‘asdfg’ for key ‘clazz.name’ 违反了数据库的唯一约束条件,即插入数据的时候具有唯一约束(被unique修饰)的列值重复了 在修改的过程中发生错误,…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…
最新文章