如何理解 Linux 当中 “一切皆文件“

news2024/11/25 23:01:19

我们在 操作系统 当中的所有操作,包括对文件的所有操作,最终其实都是 通过 进程来实现的。

我们想象我们实现的各种C/C++ 程序,或者是各种语言实现的程序,本质上都是要 编译形成 可执行文件,然后操作系统把这个可执行文件 变成进程,在我们看来就是这个程序跑起来了。

而基本的文件上的操作,基本上都依赖于进程来操作,想想我们在 windows 当中要修改一个文件,也是使用 记事本 ,word 等等的软件来修改的。

进程也是我们和操作系统之间,打交道 最为频繁使用的一种方式。

 而对于 显示器,键盘,网卡,磁盘等等这些外设,就算这些外设 在物理实现上是有很大差别的。但是,他们在方法的种类上是大同小异的。 磁盘 ,键盘 ,显示器都是有读写 操作的,只不过 磁盘有读有写,显示器只有写,键盘只有读,网卡也有读写。

操作系统为了能更好的管理这些个 外设,和 软件,都会为这些 设备 创建一个 描述方法,就是使用 struct 结构体来把这些设备的各种属性 保存起来,方便管理,管理的方式也简单,就是利用某种数据结构,把这些个 设备的 结构体对象按照某种算法链接起来,这过程叫组织。也就有了 -- 先描述在组织的方式 。

这些外设,一定是有自己的 读写方法的。磁盘 有自己的 读写方法;显示器有自己的写方法,向显示器当中写数据;······

所以,在冯诺依曼体系结构当中的外设,都是有自己的 读写方法的。这也是我们想说的 IO设备。


所以,在操作系统看来,这些个 外设设备,其实都是 文件。我们要想访问一个 外设,在操作系统看来,其实我们就是想访问一个文件;所以访问文件的操作其实都是 通过 进程的方式去访问的。

将来,用户使用进程想打开某一个 外设之时,操作系统就是以 打开文件的方式给我们打开这个外设的,也就是使用 open()之类的函数来打开这个文件。

操作系统给每一个打开的文件,都创建一个数据结构 -- file_struct

那么,这些文件被用户进行读写操作,实际上就是要调用这个 设备的 读写方法(函数),Linux 如何 对上述情况进行解释呢?

其实,在 Linux 当中使用一个了数据结构 -- struct operation_func 。这个结构体。这个结构体的地址,一般在 文件对象当中就有保存,在这个结构体当中存储了 这个 设备的 各种对应 方法(函数)的 函数指针

以后,只要是 要打开一个文件,除了会创建这个 文件的 文件结构体对象之外,还会创建一个 方法集合(函数集合)的 结构体,在这个结构体当中存储的是 这个外设的各种对应 方法(函数)的 函数指针。

通过  struct operation_func 这个结构体当中的函数指针,找到 这些外设 的 各种方法,所以我们把这个 结构体称之为 方法集

 然后,进程通过 自己的 文件描述符表,当中保存的 文件对象首地址,找到各个 被打开的文件的文件对象。在这个文件对象当中就存储了一个 类似 *f_ops 的 指针,指向 这个文件的方法集 --  struct operation_func   结构体。

然后就能进行各种 对于外设的操作了。

所以,对于进程来说,也有read()和 write()之类的函数接口,在这个接口当中,通过指针的调用,来访问到 底层 外设的 方法:

 各个 文件对象当中的 各个方法,都有这样的类似的 调用接口,这样的话,实现不同指针调用方式,就可以调用不同的 外设硬件的 方法,从而操作这些 外设。

那么,在用户看来,就只调用了 这 一个 read ()函数,就完成了 对外设的访问,这不就和 在代码当中访问 文件的方式是一样的吗?


总结一下,什么叫一切皆文件?

其实就是 ,操作系统 帮我们在文件层面,封装了一层 类似 struct_file 这样的 文件结构体对象,文件当中有一个指针,指向另一个结构体,在这个结构体当中存储了 不同设备的 各种 方法,这个结构体就是 方法集。利用函数指针的方式,来间接的把 底层 外设硬件的各种方法 进行 汇总;

上层在使用这些方法之时,根本不关心底层 外设硬件的 各种方法是如何实现的,直接通过 文件对象 通过指针 来访问到这些 外设的方法即可。

所以,在进程层面,用户在调用之时,调用 read()这些函数,这些函数当中 有 各种设备的 各种方法的 函数指针指向,直接通过这个指针指向来调用即可。不关心中间的过程。

所以,在用户看来,Linux 一切皆文件。 

 我们把 文件对象这一层,也就是 struct_file 这一层,称之为 -- VFS。(虚拟文件系统


举个例子,如果 网卡这个设备 先要被打开的话,那么必须要给 操作系统提供自己的 驱动程序,也就是各种方法。然后操作系统为这个网卡创建 这个 网卡的 文件对象 -- struct_file。

同样,网卡也有自己的方法指针集。这些的结构体对象,按照 上述我们说过的方式连接起来,将来,某一个 进程 像打开网卡访问,只需要 调用 封装好的 方法,在这些方法当中其实就是 一些 指针的调用。

用户看来也是文件。

其实,从上层 文件对象 -> 方法集合 -> 外设的方法调用 -> 不同的外设。这个过程其实就类似 继承的关系,文件对象就是 基类,往后的 方法集合 , 各种外设 其实都可以看做是 这个 文件对象的 派生类。

在用户从 基类 (文件对象 或者是 进程)看来,都是在访问一个文件,但是访问不同文件,可以调用到 不同的 外设,调用到 不同的 外设方法,这不就是多态吗?


 我们来查看源码:

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

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

相关文章

设备数据如何为预测性维护提供支持

预测性维护是现代制造业中一种高效而受欢迎的维护策略,它能够帮助企业提前发现设备故障的早期迹象,并采取相应措施,从而避免生产线的停机和生产效率的下降。实施预测性维护的关键在于充分利用设备数据,通过数据的收集、处理和分析…

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词,那到底什么是cookie呢? Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

C语言从入门到精通之【char类型】

char类型用于储存字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。 char类型占1个字…

循环服务器

一、服务器模型 在网络程序里面,通常都是一个服务器处理多 个客户机。为了处理多个客户机的请求, 服务器端的程序有不同的处理方式。 1、循环服务器模型 socket(); bind(); liste(); while(1) { accept(); while(1) { recv ret0; break; } close(acceptfd); } close…

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时,有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能,并提供了一个示例代码。 2、正文 在处理…

2023.11.14-hive的类SQL表操作之,4个by区别

目录 1.表操作之4个by,分别是 2.Order by:全局排序 3.Cluster by 4.Distribute by :分区 5. Sort by :每个Reduce内部排序 6.操作练习 步骤一.创建表 步骤二.加载数据 步骤三.验证数据 1.表操作之4个by,分别是 order by 排序字段名 cluster by 分桶并排序字段名 dis…

异常与中断(一)

使用生活实例引入中断 假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。 问:这个母亲怎么才能知道这个小孩醒? 过一会打开一次房门,看婴儿是否睡醒,然后接着看书一直等到婴儿发出声音以后再…

SQL之回炉重造

重新学sql,整个知识框架出来,之前学的太烂了 SQL是什么: SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版…

医疗行业创新:低代码工具推动业务自动化和智能化

随着科技的不断发展,数字化已经成为各个领域的必然趋势。同样,在医疗领域,数字化转型也已经成为必要性。 早在新冠疫情之前很多国家和地区就已经开始尝试医疗数字化的转型。有很多人认为,医疗数字化在未来不是锦上添花&#xff0…

黑客泄露 3500 万条 LinkedIn 用户记录

被抓取的 LinkedIn 数据库分为两部分泄露:一部分包含 500 万条用户记录,第二部分包含 3500 万条记录。 LinkedIn 数据库保存了超过 3500 万用户的个人信息,被化名 USDoD 的黑客泄露。 该数据库在臭名昭著的网络犯罪和黑客平台 Breach Forum…

langchain实战-hello world

一、LangChain简介 github地址: GitHub - langchain-ai/langchain: ⚡ Building applications with LLMs through composability ⚡ LangChain是一个用于开发由语言模型支持的应用程序的框架。它使应用程序能够: 具有上下文感知能力:将语言模…

【左程云算法全讲7】二叉树基础算法及递归套路

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…

【数据仓库】数仓分层方法详解与层次调用规范

文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层?1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…

前端学习笔记--面试题系列总结

event loop它的执行顺序: 一开始整个脚本作为一个宏任务执行执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列当前宏任务执行完出队,检查微任务列表,有则依次执行,直到全部执行完执…

vue3 el-menu初始化时选中没有高亮的问题(default-active和index的问题)

首先看官方文档的示例: 需要注意的是: 1、default-active的值是字符串,那么index绑定的值也要是字符串,且数字对应。不能default-avtive绑定的是1,而menu-item的index绑定的是45 2、default-active的值是当前选中me…

产品运营的场景和运营策略

一、启动屏 1.概念 启动屏,特指 APP 产品启动时即显示的界面,这个界面一般会停留几秒钟时间,在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…

2023.11.13 Spring Bean 的生命周期

目录 Spring 执行流程 Bean 的生命周期 五个阶段 深入理解 Bean 初始化 实例理解 总结梳理 经典面试题 Spring 执行流程 Bean 的生命周期 Spring 中 Bean 的生命周就是 Bean 在 Spring 中从创建到销毁的整个过程 五个阶段 1. 实例化 Bean 为 Bean 对象分配内存空间 …

如何在Photoshop 中创建橡皮图章效果

如何在 Photoshop 中制作橡皮图章。只需几个快速步骤即可将任何照片变成橡皮图章图像 1. 如何创建垃圾纸背景 步骤1 让我们开始学习如何制作自定义印章。创建一个新的850 x 550 像素 文档。当然,您可以为 PSD 文件使用其他尺寸, 但必须按比例调整本教程…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)

目录 基于ARM语音识别的智能家居系统 练习一 一、程序编译 练习二: 二、文件IO 三、文件IO常用API接口函数 1、打开文件 open() 2、将数据内容写入文件 write() 3、关闭(保存)文件 四、…

spring-cloud 简介

springcloud 定义 1.定义:springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理、服务发现、断路器、路由、控制总线等)2.微服务:基于单体应用,基于业务进行拆分,每个服务都是独立应用…