当前位置: 首页 > news >正文

Linux文件系统笔记

文章目录

      • FILE SYSTEM
          • 软硬链接
      • 动静态库
    • 使用别人提供的库

FILE SYSTEM

  • 文件的管理工作:
      1.基础知识:
    • 文件 = 属性 + 内容
    • 不是所有文件都会打开
    • 所有的打开的,未打开的文件会进行管理
    • 未打开文件,要能做到快速定位文件
    • 磁盘–物理存储结构
       机械磁盘定位是CHS定位法
    • 逻辑抽象–逻辑存储结构 抽象成线性结构,变成对数组的增删查改
    • 访问磁盘是一块一块(块级别的IO)的访问
        2.文件系统格式化:格式化成对应的初始化管理磁盘的状态
        3.磁盘的文件管理是磁盘的分区管理
    • 一般是分区管理;
Boot blockerBlock group 0Block group …Block group n
一般是存储BIOS等最初始启动系统的程序后面的这些块就是正常存储

Block group

Super BlockGroup Descriptor TableBlock Bitmapinode Bitmapinode TableData Block
存放文件系统本身的结构信息。记录的信息主要有:block 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了对,每个 Block group 存有进入信息,切包含了相关信息块位图,存放对应的Data Block是否被占用对应的inode是否被占用存放文件属性 如 文件大小,所有者,最近修改时间等.一个文件值对应一个inode存数据

所以一般新建文件步骤是:

  • 找到一个空闲的inode节点,把文件信息放入其中。
  • 需要几个存储块,就找几个,实在不够还可以通过映射的方式
  • 记录分配情况到inode对应的块上
  • 添加文件名到目录

删除就很简单:置零inode和对应的block bitmap就好。

软硬链接

硬链接:并非真正的文件,其实还是同一个文件。其文件inode相同

ln file1 file2
建立文件2是文件1的硬链接

linux可以多个文件对应同一个inode。

ln -s file1 file2
建立文件2是文件1的软链接

ls -li
可以查看文件inode.

软连接:本质还是文件,相当于是windows下的的快捷方式。是一个区别之前文件的新文件。

目录不允许建立硬链接,否则会存在find的时候循环。

  • 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
  • 但是linux下是具有这种结构的,比如 . 和 .. (当前目录和上级目录)

动静态库

静态库(a.):对 .o目标文件进行打包,让使用者可以直接进行连接形成程序。程序运行时不再需要动态库。
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文
件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
优点:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

静态库生成:ar -rc libname.a a.o b.o

其中 name是库的名字
查看静态库中的目录列表:ar -tv libmymath.a
打包对应的头文件和.o文件
静态库使用:
gcc test.c -I myA_lib/include -lMyA -L myA_lib/lib^C
-I 新增头文件搜索路径:表示找头文件是,也要去所给目录下找,-L新增库文件搜索路径:找库时,要去所给目录下找。-l:后面紧接所需要的库的名称

gcc默认是动态链接的:第三方库,默认不认识。如果gcc -static 就必须要有.a(也就是静态库)

动态库生成:

gcc -fPIC -c CSource1.c CSource2.c 产生位置无关码
gcc -shared -o libname.so *.o 形成动态库
也需要打包,表明对应的库和头文件

动态库使用:
1.使得程序在运行时,能找到对应的库和头文件
A.直接安装到系统

  • 拷贝对应的动态库到系统库 /lib 或者 /lib64
  • 拷贝对应的头文件到 /usr/include/
  • 完后链接的时候连接你需要使用的库即可 gcc a.c -lname

B.给当前库在当前目录或者系统库目录下建立软链接

  • 需要和库同名

C.或者添加到库环境变量

  • echo $LD_LIBRRAY_PATH
  • export 上述名称的环境变量和你的库的地址,系统呢,也能找到依赖的动态库

D.修改 /etc/ld.so.conf.d/

  • 增加我们自己的文件,内容是的存放动态库的地址

生成的代码例子:

dy-lib=libMyA.so$(dy-lib):Array.ogcc -shared -o $@ $^
%.o:%.cgcc -fPIC -c $<.PHONY:output
output:mkdir -p myA_lib/includemkdir -p myA_lib/libcp -f *.h myA_lib/includecp -f *.so myA_lib/lib.PHONY:clean
an:                                                                                       18     rm -rf *.o *.so myA_lib

可执行程序使用的是,绝对编址,库使用的是相对编址

使用别人提供的库

1.CentoOS上,可以用yum去安装对应的库
2.去yum安装之后,一般都会在linux系统里面拷贝对应的头文件和库在系统目录。
3.我们在自己的源代码使用这些库,包含头文件
4.编译链接时需要指明链了什么库

http://www.lryc.cn/news/302682.html

相关文章:

  • vue封装el-table表格组件
  • 「Python系列」Python数据结构
  • MySQL多实例部署:从概念到实操的全面指南
  • C++学习Day07之虚函数和纯虚函数
  • GZ036 区块链技术应用赛项赛题第9套
  • 微服务—RabbitMQ高级(延迟消息)
  • 香港服务器如何取消windows的自动更新
  • kali虚拟机桥接模式快速设置
  • 「连载」边缘计算(十五)02-18:边缘部分源码(源码分析篇)
  • MySQL性能调优篇(8)-NoSQL与MySQL的比较
  • 【Linux学习】线程池
  • 利用Docker部署一个简单的springboot项目
  • 【Java】纯小白的三种工厂模式基础知识学习笔记
  • Spring Boot 笔记 006 创建接口_注册
  • 沁恒CH32V30X学习笔记08---基本定时器超时功能
  • GitHub | 在 GitHub 上在线展示 Vue 项目
  • Android的Compose
  • C++ STL->list模拟实现
  • 基于python+django+vue.js开发的健身房管理系统
  • GPT-4对编程开发的支持
  • “成像光谱遥感技术中的AI革命:ChatGPT应用指南“
  • 12.25 校招 实习 内推 面经
  • 深度学习基础之《TensorFlow框架(3)—TensorBoard》
  • 杨氏矩阵和杨辉三角
  • PostgreSQL教程(四):高级特性
  • 168基于matlab的六自由度并联摇摆台的反解控制算法
  • MDC 日志跟踪笔记
  • MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
  • 人工智能|机器学习——基于机器学习的舌苔检测
  • SQL查询转化为 Elasticsearch 查询