【Linux初阶】理解一切皆文件 & 文件属性结构体底层 & 引用记数

🌟hello,各位读者大大们你们好呀🌟
🍭🍭系列专栏:【Linux初阶】
✒️✒️本篇内容:理解一切皆文件,文件属性结构体底层理解(struct file、引用记数)
🚢🚢作者简介:计算机海洋的新进船长一枚,请多多指教( •̀֊•́ ) ̖́-



前言

书接上回:
1.【Linux初阶】基础IO - 文件操作(使用系统接口实现) | vim批量注释代码
2.【Linux初阶】基础IO - 文件管理(深入理解文件描述符) | 重定向

我们之前的学习中我们学习了部分文件的相关知识,在前面的文章中我们提及到,我们可以将一切软硬件都理解为文件,这到底是为什么呢?在本篇文章中,将会得到解答。


一、如何理解一切皆文件

  1. 每个硬件设备都会有属于自己的结构体,用于储存硬件的相关属性或信息。
  2. 在硬件的结构体中,一定有自己的读写接口。例如键盘虽然只需要读取而不需要写入,但是并不妨碍它拥有读写两个接口,我们可以把不用的接口置为 null。
  3. 硬件的读写接口,存在于硬件的驱动中。每种硬件的访问方法,一定是不一样的!
  4. 每个文件都会有自己的文件属性结构体(struct file),用于存储文件属性,在文件属性的结构体中,一定会包含对应的硬件读写函数指针,使得文件可以访问具体硬件的读写方法。
  5. 文件属性结构体(struct file)是在操作系统内实现的!

在这里插入图片描述

站在上层来看,所有的设备和文件,统一都是 strcut file。在我们需要的时候,可以通过调用对应文件的读写指针,调用具体的硬件读写方法,用户是不可以跳过操作系统直接访问硬件的!因此,从用户层来看,Linux下,一切皆文件。

实际上,上层看来我们只需要使用统一的文件(实际是不同的文件),底层就会根据情况调用不同的方法,这也是多态思想的一种体现。

我们将存在于OS中的,文件属性数据结构的集合,称为虚拟文件系统(vfs)。我们通过对虚拟文件系统的管理,就可以摒弃掉底层硬件之间的差别,而统一使用文件接口的方式,来进行所有的文件(硬件)操作。


二、文件属性结构体底层理解

1.理解 struct file

在这里插入图片描述

我们可以查看 Linux内核中进程的有关内容,我们发现 在进程 struct task_struct中,包含着文件打开的信息,下面的指针指向文件描述符表。

在这里插入图片描述

转到对应的定义,我们可以发现在对应的结构体(文件描述符表)中存在对应的指针数组,指向被打开的文件

在这里插入图片描述

打开 file* 的定义,我们可以看到struct file的部分内容。其中引用记数的知识我们在下一小节会深入讲解。

在这里插入图片描述

———— 我是一条知识分割线 ————

在 struct file的内容中往下拉,我们还可以看到

在这里插入图片描述

转到定义

在这里插入图片描述

———— 我是一条知识分割线 ————

2.文件的引用记数

有多少个对象指向我(struct file),引用记数 count就是几

那么文件引用记数的作用是什么呢?我们以文件重定向为例子,之前我们学习过,文件重定向是在子进程中进行的,我们说子进程重定向不会影响父进程。

子进程重定向之前,它会将父进程的 task_struct 和 files_strcut都拷贝一份,用于对文件的操作,但是不需要将存储文件属性或文件内容的数据块再拷贝一次,子进程的文件描述符表依旧指向父进程文件描述符表中对应的文件。

假如我们一不小心在子进程中将某个文件关掉了,是不是父进程就无法再访问了呢?引用记数帮我们解决了这个问题,每个被打开文件的属性结构体中都有自己的引用记数,在子进程创建指向对应文件后,count会自动+1,在子进程结束或手动关闭时,这个文件并不会关闭,而是会将count-1,直到count为0,这个文件才会被操作系统真正关闭或删除!

在这里插入图片描述

———— 我是一条知识分割线 ————

3.总结

  • 一个被打开文件,有自己的方法指针(文件操作指针),文件被打开时,会进行初始化。
  • 可以通过 struct file找到内核缓冲区。
  • 文件引用计数(count)可以帮我们标定指向 struct file的对象个数。

结语

🌹🌹 理解一切皆文件 & 文件属性结构体底层 & 引用记数 的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值