Linux——理解文件系统和动静态库

news2024/11/24 14:20:47

一、理解文件系统

使用命令查看信息

1,使用ls -l查看文件属性和文件内容

ls -l示意图

2,stat+文件名查看更多信息

在这里插入图片描述

3,inode

Linux中的文件分为文件属性和文件内容。文件属性又称为元信息。保存在inode结构中,inode是一个文件属性的集合。一个文件名都对应着一个inode。

我们使用 ls -i,就可以查看当前目录下文件的inode编号

在这里插入图片描述
我们之前在讨论进程与文件的关系的时候,讨论的都是进程与被打开文件的关系。那么没有被打开的文件存放在哪里呢?
答案是存放在磁盘上!

磁盘

概念

其实在我们讨论进程与被打开文件之间的关系的时候,就有提到过一个可执行程序就是存放在磁盘上边的。并且冯诺依曼体系结构中磁盘属于外设,并且磁盘既可以当做输入设备,又可以当做输出设备。
磁盘是一种用于存储和读取数据的设备,它通常由一个或多个盘片组成,每个盘片都有一个可读写的磁性表面。数据被存储在盘片上的磁性表面上,通过读写磁头来访问。磁盘通常被用作计算机的主要存储设备,用于存储操作系统、应用程序和用户数据。
磁盘可以分为两种类型:机械硬盘和固态硬盘。机械硬盘使用旋转的盘片和移动的磁头来读写数据,而固态硬盘则使用闪存芯片来存储数据。固态硬盘通常比机械硬盘更快,更可靠,但也更昂贵。
在计算机中,磁盘通常被分为多个分区,每个分区可以被格式化为不同的文件系统。文件系统是一种用于组织和管理文件的方式,它定义了文件和目录的结构以及如何访问它们。常见的文件系统包括FAT、NTFS、EXT4等

磁盘实物图

在这里插入图片描述

盘片的俯视图

在这里插入图片描述
磁道:一圈圈的同心圆就是磁道。
扇区:每一圈磁道被分为了不同的小份,其中一小份就为扇区。

磁盘的剖面图

在这里插入图片描述
这个图中有六个磁头,当磁头读取数据的时候这6个磁头是一起运动的。
先确定数据是在哪个柱面上的,然后确定是在哪个磁道上的,最后确定是在哪个扇区上的。

扇区位置的确定

首先我们要明白一个事情,虽然磁片上的同心圆从里到外半径不同,但是他们存放数据的大小是一样的,就比如最里边的那个圆的半径虽然很小但是它跟最外边的圆上存放数据的大小是一样的

在这里插入图片描述

页帧

我们就可以通过LBA地址来确定每个扇面的位置。
我们给每个扇区分的大小为512byte,当我们读取或访问数据的时候是以页帧的大小来访问的。虽然每个扇区有512字节的大小,但是还是太小了。页帧的大小根据文件系统不同而不同,一般页帧的大小为4KB。

磁盘的分组管理

一个磁盘太大了,因此采用的是分而治之的方式来进行分组管理的。假如有一块500G的磁盘,我们会把它分为5个100G,然后再把100G分为20个5G,那么当我们对着其中一个5G进行管理的思想,映射到其他块中,就形成了磁盘的分组管理。
在这里插入图片描述
这一块5G的磁盘中又分了好几个部分。
每一部分可以分出好几块区域 :
在这里插入图片描述

  1. Super Block: 存放文件系统本身的结构信息。记录的信息主要有:Data Block和inode的总量、未使用的Data Block和inode的数量、一个Data Block和inode的大小、最近一次挂载的时间、最近一次写入数据的时间、最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
  2. **Group Descriptor Table:**块组描述符表,描述该分区当中块组的属性信息。
  3. Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
  4. inode Bitmap: inode位图当中记录着每个inode是否空闲可用。
  5. inode Table: 存放文件属性,即每个文件的inode。
  6. Data Blocks: 存放文件内容。

由于Block Bitmap的存在,我们删除文件的时候会非常方便,这也是为什么我们删除一个文件非常快,而创建一个文件非常慢的原因。

软硬链接

示例

在这里插入图片描述

软硬链接的区别

在这里插入图片描述
软链接又叫符号链接,软链接相对于源文件来说是一个独立的文件,因此它有独立的inode编号并且大小并不随着原文件改变而改变,但是该文件只包含了源文件的路径名,所以软链接文件的大小要比源文件小得多。软链接就类似于Windows操作系统当中的快捷方式。

软链接的应用

我们可以在其他目录下去软链接别的目录的可执行程序,并且直接运行软链接即可使用该可执行程序。因此软链接又相当于我们Windows中的快捷方式。
在这里插入图片描述

硬链接数

在这里插入图片描述

硬链接相当于给我们的文件起了个别名,硬链接数代表了有几个文件的inode号相同,图中hard_link是test的硬链接,所以他们的inode号相同。
在这里插入图片描述

文件的三个时间

  1. Access:访问
  2. Modify:内容更改的时间。
  3. Change:属性被更改的时间。 内容的大小也是属性。

在这里插入图片描述

动静态库

所需要的.h文件和.c文件

my_add.h

#include<stdio.h>

int Add(int a,int b);

my_add.c

#include "my_add.h"

int Add(int a, int b)
{
    printf("%d + %d = ?\n", a, b);
    return a + b;
}

my_sub.h

#include<stdio.h>

int Sub(int a,int b);

my_sub.c

#include "my_sub.h"

int Sub(int a, int b)
{
    printf("%d - %d = ?\n", a, b);
    return a - b;
}

main.c

#include "my_add.h"
#include "my_sub.h"

int main()
{
    int a = 10, b = 20;
    int res = Sub(a, b);
    printf("result: %d\n",res);
    res = Add(a, b);
    printf("result: %d\n",res);

    return 0;
}

静态库的使用

我们使用my_add.c和my_sub.c生成的.o(可重定位二进制文件)进行打包(归档),打包后的文件就是我们所说的库。

ar -rc libmymath.a my_add.o my_sub.o 将目标文件打包为静态库
-r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替代旧的目标文件。
-c(create):建立静态库文件 my_add.o和my_sub.o打包生成了libmymath.a的

在目录mylib下建立两个目录用于分别存放头文件和二进制(.o)打包好的库 mkdir -p mylib/include mkdir -p
mylib/lib

分别把头文件和我们打包好的库放入我们提前创建好的目录下面 cp -f *.h mylib/include cp -f *.a
mylib/lib

以上操作可以放到一个Makefile文件中,这样能简化我们的操作。
在这里插入图片描述
将Makefile中的操作进行实现

在这里插入图片描述
使用gcc编译main.c

  • -I:指定头文件搜索路径。
    -L:指定库文件搜索路径。
    -l:指明需要链接库文件路径下的哪一个库。

    生成可执行程序后直接./可执行程序就可以得出运行结果

在这里插入图片描述
我们也可以把该头文件和库文件的路径拷贝到系统路径下,这样的话就不用再指明库文件和头文件了,但是我们的静态库还是要指明的,因为库很多,我们需要让gcc知道我们的库名(去掉前缀lib和后缀.a剩下的技术库名)。
在这里插入图片描述

动态库的使用

使用的文件与静态库中的一样,这里就不一一列举了。

1、使用-fPIC进行生成.o文件(这里生成.o文件的方式与静态库不同):
在这里插入图片描述
2、使用-shared选项为所有.o文件打包为动态库
在这里插入图片描述
3、将动态库和头文件分别放在mlb目录下边的两个目录中(include和lib)。
在这里插入图片描述
4、使用gcc编译main.c生成可执行程序。
在这里插入图片描述
5、由于动态库的特殊性,我们需要进行相应的操作才能使可执行程序可以运行起来。
法一:我们可以将.so文件拷贝到系统共享库路径下
法二:更改LD_LIBRARY_PATH
法三:配置/etc/ld.so.conf.d/
我们只对法一进行举例:
在这里插入图片描述
这样就可以运行了。

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

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

相关文章

Oracle SQL执行计划操作(13)——其他相关操作

该类操作主要包括以上未进行讲解的其他相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)SELECT STATEMENT 检索表中数据。该操作出现于通过select语句检索表中数据时产生的执行计划。该操作具体如图15-1中节点0所示。 图1…

除了Axure,还有哪些原型设计工具

产品原型设计工具是设计师制作产品原型必不可少的工具。产品原型工具可以帮助我们解决很多问题&#xff0c;但产品原型工具的选择已经成为一个大问题。 除了我们熟悉的产品原型设计工具Axure&#xff0c;市场上还有很多有用的产品原型设计工具&#xff0c;本文将分享7种有用的…

redis详解之数据结构

目录 Redis是什么 Redis字符串的特点&#xff1a; 1字符串的存储 2字符串的获取 3字符串的删除 4字符串的计数 5字符串的修改 6字符串的批量操作 7字符串的二进制安全性 总结&#xff1a; Redis是什么&#xff1a; Redis是一种基于内存的键值对存储数据库&#xff0c;…

C++命名空间的定义以及使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、命名空间定义&#xff1f;1.1定义&#xff1a;1.2变量在域中的访问顺序&#xff1a; 二、命名空间使用2.1加命名空间名称及作用域限定符&#xff08;推荐&a…

【致敬未来的攻城狮计划】— 连续打卡第二十一天:RA2E1_UART —— 串口控制LED亮灭

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

js高级记录

目录 1.怎么理解闭包&#xff1f; 2.闭包的作用&#xff1f; 3.闭包可能引起的问题&#xff1f; 4.变量提升 5.函数动态参数 6.剩余参数 ...&#xff08;实际开发中提倡使用&#xff09; 7.展开运算符 8.箭头函数 9.解构赋值&#xff08;数组、对象&#xff09; 1.怎么理…

为UOS启用VNC和Windows远程桌面

1 参考资料 UOS系统中安装x11vnc远程桌面 如何通过windows电脑远程UOS桌面RDP 已在ARM版本和X86版本中验证均可用 2 准备工作 2.1 设置代理&#xff08;可选&#xff09; 如果设备本身能和公网通&#xff0c;就不需要了。 由于我们全程需要在root账号下进行&#xff0c;系…

RadSystems Studio crack视觉设计和快速行动

RadSystems Studio crack视觉设计和快速行动 RadSystems Studio是一个充满激情的开发和保存环境&#xff0c;不需要专门的编程。该软件提供数字解决方案和组件&#xff0c;以尽快在API和UI中构建程序&#xff0c;只需少量代码&#xff0c;甚至无需编写。该软件减少了编写时间并…

Kubeadm方式搭建K8s集群【1.27.0版本】

文章目录 一、集群规划及架构二、系统初始化准备(所有节点同步操作)三、安装并配置cri-dockerd插件四、安装kubeadm(所有节点同步操作)五、初始化集群六、Node节点添加到集群七、安装网络组件Calico八、测试CoreDNS解析可用性九、拓展1、ctr和crictl命令具体区别2、calico多网卡…

【计算机视觉 | 图像分割】通用AI大模型Segment Anything在医学影像分割的性能究竟如何?

最近看到了一篇论文&#xff1a; 论文地址为&#xff1a; https://arxiv.org/pdf/2304.14660.pdf这篇文章用来探究最近大火的大模型SA在医学图像上的效果。 文章目录 一、前言二、数据集展示三、方法展示四、结果分析 一、前言 近半年来&#xff0c;ChatGPT、DALLE等引发了大…

网络安全之IPSEC

目录 VPN 分类 业务层次划分 网络层次划分 VPN的常用技术 隧道技术 IPSEC VPN IPSEC的安全服务 IPSEC的技术协议族架构 ESP AH IPSEC架构 IKE 两种工作模式 两个通信协议 密钥管理协议 两个数据库 解释域 DOI 传输模式 使用场景 封装结构 隧道模式 使用场…

Spring框架|这n篇就够了

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

论文笔记——chatgpt评估+

文章目录 1. chatgpt 效果评估:Evaluating ChatGPT’s Information Extraction Capabilities: An Assessment of Performance, Explainability, Calibration, and Faithfulness文章简介文章结论 2. 事件抽取&#xff1a; OneEE: A One-Stage Framework for Fast Overlapping an…

DolphinScheduler海豚调度教程

DolphinScheduler 教程 &#xff08;一&#xff09;入门指南 简介 关于Dolphin Apache DolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系&#xff0c;不能直观监控任务健康状态等问题。DolphinScheduler以DAG流式…

MySQL知识学习06(SQL语句在MySQL中的执行过程)

1、MySQL 基本架构概览 下图是 MySQL 的一个简要架构图&#xff0c;从下图可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。 先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图 连接器&#xff1a; 身份认证和权限相关(登录 MySQL 的时候)。查询缓…

mysql数据之表管理-mysql高级管理

1. #创建表tt01 #对id字段设置零填充约束、主键约束、自增长约束 #对name字段设置非空约束、默认值约束 #对cardid字段设置非空约束、唯一键约束 插入数据记录&#xff1a; 1&#xff09;因为id字段设置了自增长&#xff0c;如果不指定id字段值&#xff0c;则默认从1开始递…

electron+vue3全家桶+vite项目搭建【17】pinia状态持久化

文章目录 引入问题演示实现效果展示、实现步骤1.封装状态初始化函数2.封装状态更新同步函数3.完整代码 引入 上一篇文章我们已经实现了electron多窗口中&#xff0c;pinia的状态同步&#xff0c;但你会发现&#xff0c;如果我们在一个窗口里面修改了状态&#xff0c;然后再打开…

第十四届蓝桥杯Python B组省赛复盘

第十四届蓝桥杯Python B组省赛复盘 文章目录 第十四届蓝桥杯Python B组省赛复盘试题 A: 2023【问题描述】&#xff08;5 分&#xff09;【思路】 试题 B: 硬币兑换【问题描述】【思路】 试题 C: 松散子序列【问题描述】【输入格式】【输出格式】【样例输入】【样例输出】【评测…

Python | 人脸识别系统 — 活体检测

本博客为人脸识别系统的活体检测代码解释 人脸识别系统博客汇总&#xff1a;人脸识别系统-博客索引 项目GitHub地址&#xff1a; 注意&#xff1a;阅读本博客前请先参考以下博客 工具安装、环境配置&#xff1a;人脸识别系统-简介 UI界面设计&#xff1a;人脸识别系统-UI界面设…

6---N字形变化

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往右逐…