Linux——理解文件系统

目录

1、inode

2、硬链接、软链接

理解硬链接 

软链接

3、静态库、动态库

静态库与动态库

生成静态库 

 生成动态库

使用动态库

运行动态库

使用外部库

库文件名称和引入库的名称



1、inode

使用ls -l命令不仅显示出了文件名,也可以显示出文件元数据

一行元数据有7列:

模式:-rw-rw-r--

硬链接数:1

文件所有者:fxy

组:fxy

大小:0

最后修改时间:Jan 23 10.21

文件名:test.c

这些信息除了通过这种方式来读取,还可以用stat命令看到更多信息

为了理解inode,我们需要先简单的了解一下文件系统

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group,而每个Block Group都有着相同的结构组成。

超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏、可以说整个文件系统结构就被破坏了。

GDT,Group Descriptor Table:块组描述符,描述块组属性信息。

块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

inode位图(inode Bitmap):每个bit表示一个inode是否可用。

i节点表:存放文件属性如文件大小,所有者,最近修改时间等。

数据区:存放文件内容。

 上面的结构图实际上就是实现了文件的属性和内容分开存放,看起来很简单,但是具体是如何工作的呢?我们通过touch一个新文件来看看如何工作。

为了说明问题,我们将上图简化:

创建一个新文件主要有以下4个操作:

1.存储属性

内核先找到一个空闲的节点(这里是1048593)。内核把文件信息记录到其中。

2.存储数据

该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

3.记录分配情况

文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

4.添加文件名到目录

新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(1048593, abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。


2、硬链接、软链接

理解硬链接 

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个inode。

abc和def的链接状态完全相同,它们被称为指向文件的硬链接。内核记录了这个连接数,inode1048593的硬链接数为2。

我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬链接数-1,如果为0,则将对应的磁盘释放。

软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法

下面解释一下文件的三个时间:

Access 最后访问时间

Modify 文件内容最后修改时间

Change 属性最后修改时间


3、静态库、动态库

静态库与动态库

 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。

在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

测试程序

add.h 

add.c 

sub.h

sub.c

main.c

生成静态库 

生成静态库

ar是gnu归档工具,rc表示(replace and create)

查看静态库中的目录列表

t:列出静态库中的文件

v:verbose 详细信息

-L 指定库路径

-l 指定库名

测试目标文件生成后,静态库删掉,程序照样可以运行

 生成动态库

shared:表示生成共享库格式

fPIC:产生位置无关码(position independent code)

库名规则:libxxx.so

使用动态库

 编译选项

l:链接动态库,只要库名即可(去掉lib以及版本号)

L:链接所在的路径

运行动态库

1、拷贝.so文件到系统共享库路径下,一般指/usr/lib

2、更改LD_LIBRARY_PATH

 

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

使用外部库

系统中其实有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)

 

-lm表示要链接libm.so或者libm.a库文件

库文件名称和引入库的名称

如:libc.so -> c库,去掉前缀lib,去掉后缀.so,.a。

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

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

相关文章

Spring 的 IOC 和 AOP

题目 Spring 的 IOC 和 AOP 推荐解析 IOC 是什么? IoC(Inversion of Control) 控制反转,是一种常见的设计思想,主要就是将手动创建对象的控制权,交给 Spring 框架来管理。 为什么需要存在一个容器&…

MVC模式

Model-View-Controller : 模型-视图-控制器模式,用于应用程序的分层开发。 Model(模型):代表一个存取数据的对象。也可以带有逻辑,在数据变化时更新控制器。 View(视图):代表模型包含的数据的可视化。 Controller(控制器)&#xf…

Nuxt3:/_nuxt/xxx.mjs请求502问题引发的_nuxt实际指向探究

一、问题描述 今天后台的小伙伴给我发了一张图: 根据图中提示,应该是在请求某个/_nuxt/xxx.mjs的时候报错了,如果单独在浏览器访问该文件路径也是能访问到的,那有可能就是访问量比较大,服务器响应不过来导致的&#x…

数组A[m+n]中存放了两个线性表(a1,a2,.....am)和(b1,b2.....bn),将数组中的两个线性表的位置互换,要求空间复杂度为1

要求空间复杂度为O(1),那么不可以借助辅助数组来完成此操作 算法思路:可先将此数组逆置变成bn,......b1,am,....,a1,然后分别逆转两个线性表的数据元素 算法实现 1、定义一个函数,该函数的功能是可以对一个数组的任意连续的部分进…

JS之打地鼠案例

需要素材的同学可以私信我 效果图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…

DAY08_SpringBoot—整合Mybatis-Plus

目录 1 MybatisPlus1.1 MP介绍1.2 MP的特点1.3 MybatisPlus入门案例1.3.1 导入jar包1.3.2 编辑POJO对象1.3.3 编辑Mapper接口1.3.4 编译YML配置文件1.3.5 编辑测试案例 1.4 MP核心原理1.4.1 需求1.4.2 原理说明1.4.3 对象转化Sql原理 1.5 MP常规操作1.5.1 添加日志打印1.5.2 测…

搭建Android开发环境—— 熟悉Android开发工具,掌握Android移动端开发环境的搭建、项目导入,并能够将项目部署到模拟器和真机进行测试。

搭建Android开发环境 一、实验目的 熟悉Android开发工具&#xff0c;掌握Android移动端开发环境的搭建、项目导入&#xff0c;并能够将项目部署到模拟器和真机进行测试。 二、实验设备及器件 1、JDK1.8安装包 2、Android Studio安装包 三、实验内容 完成JDK和Android Stud…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

MySQL视图特性

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1.基本使用 创建视图 create view 视图名 as select 语句&#xff1b; 案例&…

微信双开bat脚本中出现中文目录导致报错运行不了

在微信双开bat脚本的教程中看到一个评论&#xff1a; 可以是可以&#xff0c;写完脚本另存为的时候改变编码就行了&#xff0c;选ANSI

Socket实现服务器和客户端

Socket 编程是一种用于在网络上进行通信的编程方法&#xff0c;以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤&#xff1a;服务器端步骤&#xff1a; 1.创建 Socket&#xff1a; int serverSocket socket(AF_INET, SOCK_STREAM, 0);…

java抽象工厂实战与总结

文章目录 一、工厂模式&#xff08;三种&#xff09;1.简单工厂模式1.1 概念&#xff1a;1.2 使用场景&#xff1a;1.3 模型图解&#xff1a;1.4 伪代码&#xff1a; 2.工厂方法模式2.1 概念&#xff1a;2.2 使用场景&#xff1a;2.3 模型图解&#xff1a;2.4 伪代码 3.抽象工厂…