理解Linux—inode

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了理解Linux—inode脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

理解inode

  • 文件系统
    • ext2文件系统inode
      • 创建文件的过程
  • 硬链接
    • 软连接
    • 硬链接
      • 软硬链接区别:
        • 三个时间
  • 动静态库
    • 原理
      • 动静态库区别:
    • 静态库的打包和使用
      • 打包
      • 使用
    • 动态库的打包和使用
      • 使用

文件系统

本篇文章接上一篇(Linux基础IO)。

理解文件系统首先来了解一下磁盘,下面看图片:

理解Linux—inode

磁盘盘片:主要记录数据的部分 扇区:为最小的物理存储单位,扇区组成的就是柱面。

磁盘寻找文件的步骤: 1.先找哪个盘面 2.在找哪个柱面 3.最后确定在哪个扇区

经过以上的3个步骤就确定要读写的文件。

ext2文件系统inode

计算机如何管理好这些磁盘呢?答案是把磁盘分区。分区的头部有一个启动块(Boot Block),,该分区的其他区域会划分成一个个块组(Block Group)。

理解Linux—inode

那我们管理好一个块组就可以了,其他的都是一样的。每个块组都有相同的结构组成:

理解Linux—inode

SuPEr Block:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。 Group Descriptor Table:块组描述符,描述该分区中块组的属性信息 Block BITmap:Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用 inode Bitmap每个bit表示一个inode是否空闲可用 inode Table:存放文件属性 如 文件大小,所有者,最近修改时间等 Data blocks:存放文件内容

创建文件的过程

把上面的图简化一下:

理解Linux—inode

1.存储信息: 内核先找空闲的分区,块组,在分配inode,通过i节点表找到空闲的i结点(上面的文件是1845087),内核把文件信息记录到其中。 2.存储数据: 通过block bitmap找到空闲的块组,假如是300,500,900三个 3.将文件的内容分别存到data blocks中 4. 添加文件名到目录 新的文件名y.txt。linux如何在当前的目录中记录这个文件?内核将入口(1845087,y.txt)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

2.查找文件

首先找到该文件的分区和块组,接着找到文件对应的inode编号,在inode table中拿到该文件的属性,在根据inode和data blocks的映射关系找到是哪个块,在到data blocks拿到文件的内容。这就是查找文件。

3.理解删除文件

删除文件并不是删除数据,例如我们下载一个16G的游戏我们下载的时间比较长但是删除的时候便会很快。 删除文件:找到文件的对应block bimap和inode bitmap中的位置,此时直接把对应的有效位置改为无效,找不到映射关系即可。

软硬链接

软连接

建立软连接命令:ln -s

理解Linux—inode

我们用ll-ai查看一下,test和test.s的inode是不同的所以软连接是一个独立的文件

理解Linux—inode

我们没删掉test,test.s可以运行,但干掉test够,文件虽然在但是已经不能运行了。

硬链接

建立软连接命令 ln:

理解Linux—inode

我们看到硬链接的文件的inode和文件大小是一样的,

理解Linux—inode

干掉test,但test.h还是一样可以运行的。

理解Linux—inode

这里的链接数是硬链接,那为什么是2呢?

理解Linux—inode

还有. 跟…,分别代表当前目录和上级目录,.和tmp的inode是一样的。.tmp跟它的inode,…跟它的inode,所以链接数是2。

软硬链接区别:

软连接是单独的文件,硬链接和指向的文件共享相同的inode,相当于重命名。硬链接反应了文件名和inode的对应关系。

三个时间

理解Linux—inode

Access 最后访问时间 Modify 文件内容最后修改时间 Change 属性最后修改时间

动静态库

查看库命令:ldd

来查看一下Linux默认使用的库:

理解Linux—inode

它使用的是动态库。 在来使用静态库看看: 在makefile中加上-static

理解Linux—inode

理解Linux—inode

动态链接生成的可执行文件比静态链接的要小的多。

原理

理解Linux—inode

动态库:进程可以通过共享区,页表映射到物理内存,而静态库是直接放在代码区

动静态库区别:

动态库优点:体积小,依赖库。缺点:没有库则无法无运行 静态库优点:不依赖第三方库,移植性强 。缺点:体积大,浪费内存空间

静态库的打包和使用

为了更容易理解,创建4个文件,add.c,add.h和sub.c, sub.h

add.h内容

  1 #PRagma onec
  2 
  3 int add(int a,int b);   

add.c

  1  #include"add.h"  
  2   
  3 int add(int a, int b)  
  4 {  
  5   return a+b;                                                                                                       
  6 }  

sub.h

  1 #pragma once   
  2   
  3 int sub(int x, int y);                                                                                                

sub.c

  1 #include"sub.h"  
  2   
  3 int sub(int x,int y)  
  4 {  
  5   return x - y;                                                                                                     
  6 }

打包

我们将刚刚的4个文件先生成静态

先让文件生成对应的目标文件

理解Linux—inode

2.使用ar -rc生成静态库

理解Linux—inode

成功生成静态库 可以用命令:

ar - tv查看静态库的内容

理解Linux—inode

3.将头文件和静态库组织起来

我们把自己的库给别人用,要给别人头文件和生成的库。我们把所有的头文件放在include下,把库放到mylib下。

理解Linux—inode

我们还可以使用Makefile,非常的省事

理解Linux—inode

一个make生成静态库

理解Linux—inode

一个make output将头文件和静态库链接起来

理解Linux—inode

使用

用main.c来测试一下

  1 #include<stdio.h>
  2 #include"add.h"
  3 
  4 int main()
  5 {
  6   int a = 30;
  7   int b = 10;
  8   printf("a+b=%dn",a+b);                                                                                           
  9   return 0;
 10 }

此时使用gcc需要带上3个选项 -i:指定头文件搜索路径 -L:库文件搜索路径 -l:指定链接哪个库,(有许多库的情况下)

我把其他文件都干掉,只留下mylib。

理解Linux—inode

可以成功运行。

动态库的打包和使用

动态库跟上面的静态库基本是一样的步骤,只需要把Makefile改成动态链接。上面的add.c,add.h上面的博主在这里就不写了,跟静态库的代码是一样的。 我们直接到打包,将静态库的Makefile修改一下:

理解Linux—inode

一个make就生成库

理解Linux—inode

make output将头文件和库组织起来

理解Linux—inode

使用

使用和静态库也是一样的,使用3选项 还是创建一个main.来测试一下,我把其他的文件都干掉只留库mylib

理解Linux—inode

成功运行了。和静态库的使用是一样的,要多多练习。 本篇文章到这里就结束了。由于博主水平有限,如有错误,请直接练习博主,万分感谢!!! 欢迎一起交流!!!

理解Linux—inode

脚本宝典总结

以上是脚本宝典为你收集整理的理解Linux—inode全部内容,希望文章能够帮你解决理解Linux—inode所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。