Linux系统: 文件管理

文件系统是OS对硬件(磁盘)的抽象. OS要对软硬件资源做管理

1.文件系统

Inode(index node): 一个数据结构, 存储文件系统的元数据(如类型,权限,所有者,大小,数据块指针 )

  • Block Group: 根据分区划分出n个Block Group(每个的结构相同)
  • Super Block (超级块): 存放文件系统本身的结构信息。
  • GDT (Group Descriptor Table): 块组描述符,描述块组属性信息
  • Block Bitmap (块位图):记录着Data Block中数据块的使用情况
  • inode Bitmap (inode位图):记录着inode的使用情况
  • inode Table (i节点表): 存放文件属性, 如文件大小, 所有者, 最近修改时间等
  • Data blocks (数据区):存放文件内容,
    • 存GDT, 解决文件过大问题
    • 存文件名与inode的映射关系

文件相关知识

1.文件描述符

  • fd本质: 一个数组下标
  • fd的分配原则:  最小的, 没有被占用的文件描述符

2.重定向

1.现象描述: 重定向可以理解为, 本该显示在显示其上的东西, 却显示在了另一个文件当中

2.原理: 文件描述符表中, 文件描述符对应存的地址不再是原来文件的地址, 变为另一个文件的地址

3.一切皆文件

多态的体现

构造一个结构体对象,  里面存放文件的共有属性, 对于不同的硬件, 需要采用不同的读写方法, 那么就在结构体中定义函数指针, 指向不同硬件的读写方法.

4.缓冲区

1.概念: 一段内存空间(由库提供)

2.刷新策略

  • 立即刷新
  • 行刷新 (\n) ---显示器
  • 满刷新(全缓冲) ---磁盘文件 (效率考量)  可以尽量减少
  • 特殊情况: a.用户强制刷新(fflush)  b.进程退出

所有的设备永远都倾向于全缓冲的(更少的IO次数)

3.功能: 提供性能, 读写数据要与主存或磁盘交互(外设), 速率非常慢, 缓冲区刷新策略减少了IO次数

2.软硬链接

  • 软链接
    • 概念: 目标文件所对应的路径字符串, 可以找到文件

    • 特点: 有inode是独立的文件, 删除指向的文件影响软链接

    • 操作: ln -s 文件名

    • 应用: 快捷方式(找到文件)

  • 硬链接
    • 概念: 本质是文件的别名的计数(起别名).其建立了文件名与inode的映射关系,能找到文件

    • 特点: 没有inode不是独立的文件, 删除指向的文件不影响硬链接

    • 操作: ln 文件名

    • 应用: 目录结构( . ..),  做文件备份

    • 注意: 
      • 不允许给目录创建硬连接(避免生成回环路径)

      • 不能跨文件系统创建(依赖文件系统的inode)

3.动静态库

  • 库: 一堆.o文件
  • 为什么要有库? 提高效率, 别人写的代码直接用
  • 如何使用别人的库? 拿到.h文件, 拿到实现的文件(库), 并指明路径

1.gcc/g++的编译

  • 默认知道C/C++的库, 默认优先链接动态库, 默认支持生成动态库

  • 第三方库的使用时候要告诉其路径:1.头文件路径 2.链接路径 3.链接那个库

 gcc main.c -I ./mylib/include -L ./mylib/lib -lmyc 

1.头文件路径 : -I    ./mylib/include
2.链接路径   : -L    ./mylib/lib
3.链接那个库 : -lmyc (去前后缀 -前缀: lib -后缀: .a)

(显示指定连接什么库, 头文件已在main.c中显示指定了)
  • -static: 强制将我们的连接进行静态连接. 要求: 有对应的静态版. (若无static优先动态链接)

2.可指向程序的运行

  • 静态库 : 静态库在编译期间, 将库中代码拷贝到程序内部. 后序加载与库无关

  • 动态库 : 动态库时运行时加载, 运行要找到动态库加载并运行(要告诉OS路径)

3.动态库与静态库的操作

静态库: .a

生成静态库: ar -rc libmyc.a *.o (打包所有.o文件)

编译:gcc main.c -I ./mylib/include(头文件路径) -L ./mylib/lib(库路径) -lmyc(指定库)

运行: 静态库在编译期间, 将库中代码拷贝到程序内部, 加载和库就无关系

动态库: .so

生成.o文件 : gcc -fPIC  -c  xx.c  -o xx.o

生成动态库 : gcc -shared *.o  -o libmyc.so (打包所有.o文件)

编译: gcc main.c -I ./mylib/include(头文件路径) -L ./mylib/lib(库路径) -lmyc(指定库)

运行: 动态库要在程序运行的时候, 找到动态库加载并运行(要告诉OS路径)

告诉OS路径

  • 默认路径: 将库安装到/lib64

  • 软连接: 在/lib64目录下建立动态库的软链接

sudo ln -s 动态库路径(绝对路径)  /lib64/libxx.so(库名)
  • 环境变量(内存级): LD_LIBRARY_PATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 路径
  • 环境变量(配置文件): ~/.bashrc
1.打开文件
2.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx:路径
3.source ~/.bashrc 刷新

  • 动态库搜索的配置文件: /etc/ld.so.conf.d

1.创建xxx.conf
2.写入绝对路径
3.执行ldconfig -> 生效

4.动态库加载

  • 程序在编译成功的时候就已经有了地址->可以知道main函数地址, 各函数地址的偏移量
  • 动态库加载到内存, 有了物理地址, 
  • 加载后,动态库要映射到当前进程堆栈之间的共享区

5.其它

  • 头文件搜索路径: /usr/include

  • 库的搜索路径 : /lib64

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值