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

news2024/11/26 11:55:50

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


文章目录

  • 前言
  • 一、如何理解一切皆文件
  • 二、文件属性结构体底层理解
    • 1.理解 struct file
    • 2.文件的引用记数
    • 3.总结
  • 结语


前言

书接上回:
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++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次被通报的挖矿事件应急响应

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 事件背景介绍02 定位挖矿主机03 挖矿主机分析04 入侵路径梳理05 安全加固建议 01 事件背景介绍 某单位被上级单位通报,单位的出口IP和境外IP有异常通信行为,要求进行紧急处置…

【MySQL】何为MySQL,一文告诉你答案

文章目录 前言Oracle(甲骨文公司)MySQL关系型数据库应用环境特性 前言 在认识JAVA一文中我们有谈到过收购Sun公司的Oracle(甲骨文公司)1,今天我们要介绍的MySQL就属于 Oracle 旗下产品。 Oracle(甲骨文公司…

远航汽车:坚持合作共赢经营理念 携手志同道合者共创美好未来

智能汽车时代,想要打造一款真正符合用户需求的新能源车,势必要具备硬核技术实力以及敢于突破、不断求变的思维,始终做到以用户为中心,打造属于自己的品牌核心力,才能从激烈的市场竞争中脱颖而出。在此背景下&#xff0…

【电路原理学习笔记】第2章:电压、电流和电阻:2.6 电路

第2章:电压、电流和电阻 2.6 电路 2.6.1 电流的方向 电流方向有两种说法,一种按电子流动方向,另一种是传统的认为从正极流出到负极,这本教材采用传统电流方法。(事传统派,维新派输了,1&#…

全新QQ架构的“NT”版来袭

最近,全新发布的"NT"架构的QQ迎来了更新,同时面向用户开放了下载渠道,有些用户戏称为NT为脑瘫版本(bushi)苏音体验了以后,描述为:清爽简约还很流畅。 先来看看原来的QQ与现在的NT版本…

【Linux】Selinux基本了解

文章目录 SElinux1.简介2.基本概念3.规则4.策略5.工作模式 SElinux 1.简介 SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中。因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效…

仿真模拟-Abaqus2021、Abaqus2022 安装下载教程

ABAQUS 是一套功能强大的工程模拟的有限元软件,其解决问题的范围从相对简单的线性分析到许多复杂的非线性问题。 ABAQUS 包括一个丰富的、可模拟任意几何形状的单元库。并拥有各种类型的材料模型库,可以模拟典型工程材料的性能,其中包括金属、…

Addressable 资源管理全解

这里写目录标题 一、什么是Addresables二、导入Addressables三、创建Addressables Settings 资产包管理四、资源集合Group的基本操作(资源分包)五、设置远程资源包六、如何打包七、加载方式7-1. Mono脚本指定和实例化:7-2. 直接实例化指定物体…

Neo4j docker 部署

想要运行简单测试一下neo4j,就直接使用docker创建了一个容器,并用cypher-shell本地连接neo4j,创建图进行测试。 1 开启docker sudo systemctl start docker2 拉取镜像源 sudo docker pull neo4j # 默认latest版本3 查看本地镜像&#xff0…

二叉树之按之字形顺序打印二叉树

主要看队列的应用与了解,就是利用先进先出的特点。先把每个节点塞入队列,再根据先进先出的特点来把自身值传入一维vector数组中去。 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), l…

作为爬虫工程师,自动化和抓包你说不了解的selenium采集内容篇!

前言 作为爬虫工程师,掌握Selenium采集是非常有用的,因为有些网站采用了动态加载、javascript渲染或AJAX技术,这些技术使得使用传统的静态HTML解析库难以获取到完整的数据。Selenium是一个自动化测试工具,它可以模拟用户在浏览器…

java特征:多态性

文章目录 多态的形式和体现对象的多态性多态的理解举例**1、方法内局部变量的赋值体现多态****2、方法的形参声明体现多态****3、方法返回值类型体现多态** 成员变量没有多态性向上转型与向下转型为什么要类型转换如何向上或向下转型instanceof关键字 多态的形式和体现 对象的…

【电路原理学习笔记】第2章:电压、电流和电阻:2.4 电流

第2章:电压、电流和电阻 2.4 电流 电压为电子提供能量,使它们能够在电路中运动。在金属导体中,电子的运动就是电流,电流的存在意味着在电路中存在着做功的过程。 自由电子存在于导体和半导体中。这些价电子层上的电子可以从材料…

微信小程序数据绑定及渲染

微信开发文档&#xff1a;WXML | 微信开放文档 (qq.com) 数据绑定 简单数据绑定 小程序原生支持数据的双向绑定&#xff0c;在wxml文件里面可以使用 Mustache 语法(双{{ }}方法)绑定js文件中data里面的属性 示例&#xff1a; wxml文件内容&#xff1a; <view> {{ mess…

ChromaVerse专注于AIGC元宇宙产业

在元宇宙与互联网 3.0 概念的推动下&#xff0c;各种虚拟数字人扑面而来&#xff0c;AIGC 产业成为各方关注的重点。未来 AI 发展已经成为全球科技领域的热点和趋势。AI 技术的快速进步和广泛应用正在改变人们的生活和工作方式&#xff0c;为各行各业带来了巨大的机遇和挑战。在…

Jmeter接口测试,怎么在下一个接口调用上一个接口的数据

1、简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库&#xff0c; FTP 服务…

MacOS在终端中使用sshpass命令登录服务器

MacOS在终端中使用sshpass命令登录服务器&#xff08;堡垒机&#xff09; sshpass 可以解决ssh时密码交互输入的麻烦。 目前堡垒机不支持密钥&#xff0c;使用sshpass命令可以较便捷地连接服务器。 sshpass -p password ssh -p 22 userftm.test.com# 注意user中如果有&…

SpringBoot 基于Redis的消息队列(基于发布订阅模型)

SpringBoot下Redis消息队列(基于发布订阅模型) 1. 什么是生产者/消费者模式&#xff1f; 消息队列一般是有两种场景 1、种是发布者订阅者模式 2、种是生产者消费者模式 生产者消费者模式 &#xff1a;生产者生产消息放到队列里&#xff0c;多个消费者同时监听队列&#xff0…

详解DNS协议!

前言 想要不同的计算机之间进行通信&#xff0c;是需要知道对方的IP的&#xff0c;可是为什么我们平时很少用到ip&#xff0c;而是用到域名这种东西呢&#xff1f; 其实主要是为了方便阅读&#xff0c;让我们记住一串的ip还不如记域名来的方便。 当我们访问域名的时候&#xf…

【MYSQL基础】基础知识了解

基础概念 数据库(DataBase&#xff0c;简称DB)&#xff0c;用于存储和管理大量数据的仓库。 数据库特点 持久化存储数据的。其实数据库就是一个文件系统方便存储和管理数据使用了统一的方式操作数据库-- SQL 数据库有哪些 MYSQL: 开源免费的数据库&#xff0c;小型的数据库…