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

news2024/11/18 11:49:32

目录

一、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.coloradmin.cn/o/1657816.html

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

相关文章

MySQL#MySql表的操作

目录 一、创建表 二、查看表结构 三、修改表 1.修改表的名字 2.新增一个列 3.修改列 4.删除列 5.修改列的名称 四、删除表 一、创建表 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校…

基于Transformer网络的多步预测模型

包括完整流程数据代码处理: 多步预测数据集制作、数据加载、模型定义、参数设置、模型训练、模型测试、预测可视化、多步预测、模型评估 ● 环境框架:python 3.9 pytorch 1.8 及其以上版本均可运行 ● 使用对象:论文需求、毕业设计需求者…

为什么要计算光伏发电量等数据?

在当今世界,随着全球气候变化和环境问题的日益突出,可再生能源的利用和发展成为了全球关注的焦点。其中,光伏发电作为最具代表性的可再生能源之一,因其清洁、可再生的特性而备受瞩目。然而,光伏发电量的计算及其相关数…

pytest + yaml 框架 - 参数化读取文件路径优化

针对小伙伴提出参数化时读取外部文件,在项目根路径运行没问题,但是进入到项目下子文件夹运行用例,就会找不到文件问题做了优化。 关于参数化读取外部文件相关内容参考前面这篇pytest yaml 框架 -25.参数化数据支持读取外部文件txt/csv/json/…

Day3 | Java基础 | 4常见类

Day3 | Java基础 | 4 常见类 基础版Object类equalshashCode(散列码)hashCode和equals clone方法String类 问题回答版Object类Object类的常见方法有哪些?和equals()的区别是什么?为什么要有hashCode?hashCode和equals的…

单位圆内的正交向量多项式,第一部分:由Zernike多项式的梯度导出的基组

clear all; close all; clc; %% I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存\image\imgs\right\0.bmp)); I2=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.法\image\imgs\right\1.bmp)); I3=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.p\image\imgs…

探秘Tailwind CSS:前端开发的加速器(Tailwind CSS让CSS编写更简洁)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Tailwind CSS 📒📝 快速体验📝 深入学习⚓️ 相关链接 ⚓️📖 介绍 📖 在这个快速迭代的互联网时代,前端开发效率和设计质量的双重要求,使得开发者们不断寻求更高效的工具和方法。今天,我们要介绍的是一个能够极大…

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…

IntelliJ IDEA 配置JDK

IntelliJ IDEA-之配置JDK 我们的开发神器IDEA安装好了之后,在实际开发中,我们如何去配置好JDK的版本呢? 注意:需要保证JDK在已经成功安装的情况下,再进行IDEA的配置 现在就行动,让IntelliJ IDEA成为你征…

FebHost:什么是域名DNS服务器?

域名服务器是一种将域名转换为IP地址的计算机。在域名系统(DNS)中,它起着至关重要的作用。用户只需在浏览器的地址栏输入域名,而无需手动输入网站服务器的IP地址,就可以访问网站。 每个已注册的域名都必须在其DNS记录…

uniapp获取微信小程序头像并上传(前后端代码)

背景 在uniapp实现微信小程序登陆过程中, 我们提供了用户获取自己的头像功能。 但是微信获取的头像都是临时路径。 需要我们进行转换并上传。 本文记录从前后端如何完成这个头像获取,上传到服务器的过程。 //这个就是微信的临时头像路径 wxfile://tmp_…

基于大语言模型的Agent的探索与实践

AI代理是人工智能领域的核心概念之一,它指的是能够在环境中感知、做出决策并采取行动的计算实体。代理可以是简单的,如自动化的网页爬虫,也可以是复杂的,如能够进行战略规划和学习的自主机器人。 AI代理的概念最早源于哲学探讨&am…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

景源畅信电商:抖音小店有哪些比较热门的宣传方法?

抖音小店的热门宣传方法,是许多商家关注的焦点。在数字化营销时代,有效的宣传手段不仅能提升品牌知名度,还能吸引潜在消费者,促进销售。以下是针对抖音小店热门宣传方法的详细阐述: 一、短视频内容营销 作为抖音的核心…

思腾合力受邀参加VALSE 2024视觉与学习青年学者研讨会

在充满学术氛围的五月,思腾合力荣幸受邀参加了于2024年5月5-7日在重庆举行的第十四届VALSE大会。作为视觉与学习领域的顶级交流平台,VALSE大会每年都吸引着全国专家与学者的目光。 本次大会不仅延续了往届的高水平学术研讨,还进一步拓宽了研究…

A100 解析:为何它成为 AI 大模型时代的首选?

前言 NVIDIA A100 Tensor Core GPU 可针对 AI、数据分析和 HPC 应用场景,在不同规模下实现出色的加速,有效助力更高性能的弹性数据中心。A100 采用 NVIDIA Ampere 架构,是 NVIDIA 数据中心平台的引擎。A100 的性能比上一代产品提升高达 20 倍…

Flume进阶

目录 第1关:拦截器的使用 第2关:自定义拦截器 第1关:拦截器的使用 代码文件: # Define source, channel, sink #agent名称为a1# Define source #source类型配置为avro,监听8888端口,后台会自动发送数据到该端口 #拦截后…

Git泄露(CTFHUB的git泄露)

log 当dirsearch 扫描一下,命令: python dirsearch.py -u url/.git 发现存在了git泄露 借助kali里面,打开GitHack所在的目录,然后 输入: python2 GitHack.py -u url/.git/ 必须要用Python2 tree 命令 可以看到…

Paddle 基于ANN(全连接神经网络)的GAN(生成对抗网络)实现

什么是GAN GAN是生成对抗网络,将会根据一个随机向量,实现数据的生成(如生成手写数字、生成文本等)。 GAN的训练过程中,需要有一个生成器G和一个鉴别器D. 生成器用于生成数据,鉴定器用于鉴定数据的准确性&…

2-6 任务 猜数小游戏(单次版)

本任务要求编写一个猜数小游戏(单次版),游戏规则是计算机产生一个0到100之间的随机整数,用户通过输入猜测的数字进行猜测,根据猜测情况给出提示,直到猜对为止。编程思路是利用while循环和多分支结构实现永真…