深入理解 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.mzph.cn/diannao/9159.shtml

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

相关文章

通用型产品发布解决方案(基础环境搭建)

文章目录 1.项目技术栈和前置技术2.创建Linux平台1.需求分析2.安装Virtual Box1.BIOS里修改设置开启虚拟化设备支持(f2 或f10)2.任务管理器 -> cpu 查看虚拟化是否开启3.卸载方式4.安装6.1.265.管理员身份运行,选择安装位置6.一直下一步&a…

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意:一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是:电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子,右键只有“全部提取…

大厂Java面试题:MyBatis是如何进行分页的?分页插件的实现原理是什么?

大家好,我是王有志。 今天给大家带来的是一道来自京东的关于 MyBatis 实现分页功能的面试题:MyBatis是如何进行分页的?分页插件的实现原理是什么?通常,分页的方式可以分为两种: 逻辑(内存&…

如何开启深色模式【攻略】

如何开启深色模式【攻略】 前言版权推荐如何开启深色模式介绍手机系统手机微信手机QQ手机快手手机抖音 电脑系统电脑微信电脑QQ电脑WPS电脑浏览器 最后 前言 2024-5-9 20:48:21 深色模式给人以一种高级感。 本文介绍一些常用软件深色模式的开启 以下内容源自《【攻略】》 仅…

从零开始写 Docker(十三)---实现 mydocker rm 删除容器

本文为从零开始写 Docker 系列第十三篇,实现类似 docker rm 的功能,使得我们能够删除容器。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理:深…

谷歌CEO最新访谈:AI浪潮仍处于早期阶段,公司未来最大威胁是执行力不足

作为搜索领域无可争议的霸主,谷歌改变了我们生活的方方面面,从日常琐事到工作事务,再到我们的沟通方式。多年来,谷歌一直是互联网的窗口,为我们提供大量知识和信息,但如今,随着其他类似平台的崛…

HarmonyOS开发之ArkTS使用:用户登录页面应用

目录 目录 前言 关于HarmonyOS 环境准备 新建项目 设计用户登录页面 1. 布局设计 2. 编写ArkTS代码 运行和测试 结束语 前言 随着HarmonyOS(鸿蒙操作系统)的不断发展,越来越多的开发者开始投入到这个全新的生态系统中,而…

车载测试系列:车载测试Bug定位与分析

车载Bug定位 1.1 模拟复现条件 能够复现bug才能对问题进行定位、解决以及验证。找到bug存在的特定的条件,进行重现。对于依赖外部输入的条件,如果条件比较复杂难以模拟可以在程序里预设直接进入对应状态。 1.2 打印Log 根据问题的现象,在…

Spring-依赖来源

依赖来源 1 Spring BeanDefinition(xml,注解,BeanDefinitionBuilder, 还有API实现的单例对象) 2 Spring 内建BeanDefinition 3 内建单例对象 依赖注入和依赖查找的区别 Context.refresh() 的时候会调用这个方法:prepareBeanF…

扩展学习|结合故事的力量和数字的力量:混合方法研究和混合研究综述

文献来源:Pluye, Pierre, and Quan Nha Hong. "Combining the power of stories and the power of numbers: mixed methods research and mixed studies reviews." Annual review of public health 35 (2014): 29-45. 文献获取:链接&#xff1…

最靠谱线上线下相亲交友婚恋脱单渠道指南大全,单身必看!

刚好在30岁的年纪把自己嫁出去啦。以下这些都是我经历过的相亲途径,分享出来,希望能帮到大家 一.线上小程序/App 1.单身狗解救平台(高质量人多,工作学历实名认证,你可能看到眼花,自己得有自己辨别力&#x…

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录 一、 qcxserver自启动关不掉二、 qcxserver启动后串行器(MAX96717)detect不到?三、 qcarcam_test运行后系统log提示QCarCamReserve错误四、 tuning错误导致的异常DumpCore本文主要记录CAMERA开发过程中的一…

[ 项目 ] tcmalloc简化版—高并发内存池

目录 前言 基本介绍 高并发 内存池 定长内存池 基本介绍 框架设计 具体实现 性能测试 整体框架介绍 申请内存过程 threadcache 1.基本介绍 2.具体实现 centralcache 1.基本介绍 2.具体实现 pagecache 1.基本介绍 2.具体实现 申请内存连通 释放内存过…

探索智能编程新境界:我与Baidu Comate的独特体验之旅

文章目录 一、认识Baidu Comate二、VS Code安装Baidu Comate教程三、Baidu Comate功能体验功能概览具体功能1.根据注释自动生成代码2.函数注释3.行间注释4.代码解释5.生成单元测试6.代码优化7.答疑解惑 四、交互体验五、总结 一、认识Baidu Comate ✨Baidu Comate插件是一款基…

QT---day4事件

1、思维导图 2、 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类 #include<QPushButton> //按钮…

阿里云开发uniapp之uni-starter

一、为什么使用uni-starter uni-starter是集成商用项目常见功能的、云端一体应用快速开发项目模版。 一个应用有很多通用的功能&#xff0c;比如登录注册、个人中心、设置、权限管理、拦截器、banner... uni-starter将这些功能都已经集成好&#xff0c;另外&#xff0c;uni-s…

Baidu Comate智能编码助手

Baidu Comate智能编码助手 &#x1f388;1.Baidu Comate的简介&#x1f388;2.安装Baidu Comate&#x1f388;3.Baidu Comate实现功能&#x1f388;4.使用注释进行智能代码提示&#x1f388;5.结束语 &#x1f388;1.Baidu Comate的简介 根据官网的介绍&#xff0c;我们了解到B…

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

完成单位投稿任务找投稿渠道不用精选10个1个就够了

在单位担任信息宣传员的这几年,我深刻体会到了“笔耕不辍”的艰辛与挑战。起初,面对单位的宣传需求,我遵循传统的投稿路径,即通过电子邮件的方式,一家接一家地向各大媒体投递稿件。那时的我,以为只要稿件质量上乘,自然能够获得青睐,却未曾料到,这是一条漫长而曲折的道路。 邮箱…

算法day03

第一题 179. 查找总价格为目标值的两个商品 本题采用前后指针和单调性规律可解&#xff1b; 解题思路如下&#xff1a; 1、设置前后指针 2、前后指针所指的两数之和大于目标数&#xff0c;右指针左移&#xff1b; 前后指针所指的两数之和小于目标数&#xff0c;左指针右移&…