Linux——基础I/O(二)(重定向,缓冲区,dup2,深入理解ext2文件系统,软硬链接,动静态库)

1.重定向

1.1什么是重定向

  • 把本应该写到显示器上的内容,写到了文件里,这就叫做文件的重定向
    在这里插入图片描述
  • 我们再举一个追加重定向的例子
    在这里插入图片描述

1.2重定向的原理

在这里插入图片描述

2.缓冲区

2.1什么是缓冲区?

  • 缓冲区是语言层面提供的,由file结构体进行维护
    在这里插入图片描述

2.2两种现象对比

  • 第一种
    在这里插入图片描述
  • 第二种
    在这里插入图片描述
  • 总结:
  • write系统调用接口只往文件里写了一行,但是库函数却都写了两行
  • 这是由于缓冲区导致的,我们平时输出到显示器上面的内容是行缓冲,而输出到文件里是全缓冲
  • 如果我们close(1),将标准输出关闭,1号文件描述符就变成了我们新创建的文件,所以在输入内容的时候用的是全缓冲
  • 我们在其中加入了fork(),系统调用接口write已经将内容写到了log.txt当中,说明没有缓冲机制
  • 但是两个库函数,是先写入缓冲区,然后创建父子进程,再分别刷新各自独立的缓冲区,这就导致输出两遍
  • 进而我们可以得出结论,缓冲区机制是由语言层面提供的,并不是操作系统
  • 但是操作系统也有自带的缓冲区
    在这里插入图片描述
  • file *stream的作用就是将用户级别的缓冲区,往操作系统刷新(例如调用write接口)

3.dup2接口

3.1dup2描述及使用

  • newfdoldfd的一份拷贝

在这里插入图片描述

  • dup2的使用,将fd的内容拷贝至1号文件描述符下

在这里插入图片描述

3.2dup2接口的原理

  • dup2的描述:dup2(fd,1)
  • 调用dup2后,1号文件描述符本来对应的是别的struct file,这个时候切断这个链接,就像close(1)一样,他就会去指向它要拷贝的那个文件描述符指向的struct file

4.理解文件系统(以ext2分析)

4.1什么是文件系统?

  • 本质上其实是系统对文件的一种管理策略,然后代码化,功能化,就变成了文件系统
    在这里插入图片描述

4.2 ext2文件系统中的磁盘文件

4.2.1磁盘结构分析

在这里插入图片描述
在这里插入图片描述

  • 那么具体如何分区管理呢?我们接下来看

4.2.2 磁盘分区管理的具体方式

在这里插入图片描述

4.3创建一个文件系统内部发生什么?

  • 将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作
    在这里插入图片描述

4.4查找,删除文件发生了什么?

  • 查找文件:找到文件所在的分区块组,通过inode编号在inode table中找到对应的属性,再寻找对应的block映射关系,将数据块中的内容提取出来
  • 删除操作:在位图中,将inode对应的编号由10
  • 场景举例:如果文件被误删了,我们还有机会找回来,因为只是修改了位图真正的inode没有被删除,如果我们的数据没有被覆盖,可以通过遍历inode table找到对应的属性信息,就可以找到对应的数据块映射关系,就可以恢复文件了

4.5Linux中目录也是文件(一切皆文件)

在这里插入图片描述

4.6 ext2文件系统

在这里插入图片描述

5.文件的软硬链接

  • 文件链接分为硬链接和软链接两种

  • 硬链接:没有独立的inode,只是增加了一个和inode具有映射关系的文件名,并没有创建新的文件
    在这里插入图片描述

  • 软链接:则是创建了一个新的文件,具有独立的inode,这个文件保存着链接文件的路径
    在这里插入图片描述

6.关于动静态库的理解

6.1 C语言中的库函数调用过程

  • 我们在写C语言过程中,在预处理阶段对stdio.h进行了包含,并且头文件只有printf的声明,那函数的实现应该存放在哪里?
  • 系统将这些函数的实现放到了名为lib.so.6这个库文件当中,如果没有特别指定的情况,gcc会到系统默认的搜索路径/usr/lib下去查找,实质就是链接到lib.so.6里的库函数,进而实现了函数
    在这里插入图片描述

6.2动,静态库有什么区别?

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

  • 静态链接库

  • 优点:库缺失不影响程序,运行速度快

  • 缺点:由于静态库链接是将库的内容拷贝到程序,引起空间资源浪费

  • ————————————————————————————

  • 动态库:在运行时才去链接动态库的代码,整个系统里可以多个程序去共享使用库的代码

  • 动态链接库

  • 优点:程序体积小,节省空间

  • 缺点:库缺失,程序就无法运行,可移植性差

  • ————————————————————————————

  • 总结

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

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

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

6.3函数库的生成

在这里插入图片描述
在这里插入图片描述

6.3.1库函数的参数

  • 头文件:可以使用的方法或参数
  • 库文件:具体的实现(二进制),为动静态链接提供条件

6.3.2静态库的生成及使用

在这里插入图片描述

6.3.3动态库的生成及使用

在这里插入图片描述

6.3.4如何让程序找到依赖的动态库?

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值