linux下一切皆文件,如何理解?

news2024/9/23 15:27:47

        linux下一切皆文件,不管你有没有学过linux,都应该听过这句话,就像java的一切皆对象一样。

        今天就来看看它的真面目。

        你记住了,只要一个竞争退出它的PCB要被释放文件名,客服表也要被释放。那么,指向这个文件的指针就少了啊,那么可以理解成,如果一个文件只被这一进程打开,这个文件也自动就被关掉了啊。

        以前的文章说计算机体系结构的时候,说过最底最底下呢,我们是有一堆的硬件。不知道的可以看一下这个这篇文章花钱买不到系列—linux 冯诺依曼体系结构-CSDN博客

        在我们的冯诺伊曼体结构里,这些设备都属于外设。还记得吗啊,属于外设的话,那么不管是键盘显示器磁盘还是网卡外部或外围设备?那么,它任何的数据处理都必须把数据先读到内存,然后处理完毕之后再将内存当中的数据刷新到外设当中。这叫做IO 。

        对于我们来讲呢,键盘它也一定要有键盘所对应的一套读写方法。那么,因为我们曾经说过,操作系统为了管理所有的软硬件,那软硬件很多,所以操作系统它就必须得对所有的软硬件资源呢进行先描述,再组织。

        所以不管是键盘、显示器、硬盘、网卡,都要有我们对应的结构体,那么它这些结构体里包含了这些设备,每一个设备对应的所有的属性信息。

        那么这些设备呢,那么它对应的一定要有自己的对应的IO函数。那么你要输入输出嘛,所以我们也一定要有对应的这些方法,当然除了这些,它肯定还有其他方法啊。今天重点聊这个。

        比如说键盘呢,它也一定要有对应的keyboardread()方法。也一定要有int keyboardwrite()方法,那你说我们经常键盘作为输入设备,那它有数据了,我主要是读取它,那么这里呢,读取它我可以理解。那么,其中呢?我什么时候会往键盘去写呢啊?我们从来没有往键盘里写。事实呢,我们也确实不会往键盘去写,但并不妨碍他有个写方法,这个写方法我们可以就是一个null。

        那么我们允许你可以那么每一个硬件设备。都要有自己的读写方法,那么你如果天然不支持读或者写,那很好啊,不影响你的方法,为NULL就行了

        具体的这些我们硬件的读写方法,一定是在自己的在各种硬件匹配的驱动程序里。

        因为不同的硬件,那么它都有自己的读写方法。所以呢,那么每一个文件,它的驱动程序,那么都有自己的读写方法,这个肯定是不一样的。

        学了一些这么多概念之后呢,也知道每一种我们对应的硬件,那么它的访问方法啊,方法是一定不一样的。肯定是不一样的,读磁盘怎么能跟读网卡一样呢?读我们的显示器怎么能跟读键盘一样呢?一定是不一样的啊,那么但是你怎么来表示这里的我们的键盘显示器磁盘或者网卡呢?

        那么其中我们的linux呢?它做了一个设计,比如说呢,那么只要你进行读写。那么我可以抽象出,比如说键盘读写的时候,我可以认为你的那么目标写入的那个,你的存键盘的存储空间为零。那么你的数据,我在读的时候,那么你也有自己的状态啊,那么包括是被打开的还是被关闭的?那么键盘显示器它的所有的属性呢?我们都可以把它抽象出来啊

        所以呢,那么我们linux当中呢,它是这么设计的啊,那么在我们的操作系统内部呢?一切皆文件体现的就是struct file,任何一个被打开的文件在内核里,我们的内核结构的对象就叫做struct feel类型的对象,包括了各种文件的属性啊。虽然底层的这些硬件呢,大家是有差别的读写方法一定不一样,但是属性呢?那么我们是可以通过数据层面上去把它统一下的。

        比如说type表示什么类型的文件,status表示打开还是关闭,每一个虽然它打开方式不一样,但你有没有被打开我是知道的啊,所有属性呢?我们其实是可以公共性的抽取出来,只不过大家。属性的个数和具体属性的值写的不一样,但并不影响啊,那么这是其一。

        其二呢,将来啊,一切皆文件对于操作系统来讲,操作系统会说啊,不同的文件呢,那么对应的读写方法是不一样的,那么file里面一定充满大量的函数指针。

        那么其中呢?当我们打开我们对应的键盘时。把键盘的对应给它创建一个struct filel对象,然后怎么办呢?然后我们把那么read方法数属性初始化之后,让我们的函数指针。指向具体的我们键盘的读方法和键盘的写方法。

 多来几个,就变成这个样子

         

        而这个struck file对象里面的所有属性呢?可以根据硬件的不同去填充就可以。我在初始化这里的每一个不同的设备的时候,我们让它的函数指针指向我们,那么具体某一种硬件的读写方法啊,我们给它啊,比如说是我们的显示器的啊,比如说磁盘的读方法,磁盘的写方法,那么网卡的读方法,网卡的写方法。当然中间还有一对软件,只是简单一下,当然每个struct中还有一个指针,指向他们。这就是先描述后组织。

 所以站在操作系统,站用户之上,压根不关心你你底层的差异。他要读文件的时候,他压根就不关心你底层。文件的所有的不同,对我看来上层我们无论是操作系统内部要读写这个文件,还是用户。那么,他们看到的只有struct filel读写方法时,他们直接调用对应的函数指针,指向具体方法,但用户不关心。所以在用户级下看到的就是一切皆文件。

         所以这是什么?这就是多态,我们只需要使用我们对应的统一文件,那么我们就使用我们就可以访问同样的文件,那么底层的那么差异呢,其实就可以那么体现出来了,这是用C语言来实现的多态的特征啊,那么我们这里的s结构体就相当于是基类。上下下面的所有东西也称为子类,然后呢,这就是一种多态的实现啊。所以为什么现在很多语言都是支持面向对象或者说是多态,这都是经过工程师们的大量软件工程的结果。

        到内核里里面看看是不是如我所说struct task_struct {}是进程的pcb

        

 就是这里 struct files_struct,屏蔽底层差异化,在上层看来就是open打开文件close关闭文件  

但是转到定义,会发现这里有一个指针数组,是指向被打开的文件

数组的大小是32,默认的 

 

这里有一个二级指针,扩展打开的文件 

 

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

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

相关文章

基于大数据的电信诈骗行为可视化系统含预测研究【lightGBM,XGBoost,随机森林】

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍 电信诈骗预测与分析系统项目概述系统架构详细功能描述1. 数据预处理2. 数据可视化与分析3. 机器学习预测4. 系统集成与用户界面 技术亮点应用价值未来展望lightGBMXGBoost随机森林…

猫头虎分享:什么是信创体系?

猫头虎分享:什么是信创体系? 猫头虎技术团队:深入解析信创体系 引言:为什么信创体系是未来发展的关键? 大家好,我是猫头虎,今天我们来聊一聊科技领域的热议话题——信创体系。随着国内外信息技术产业的迅…

分布式云扩展 AI 边缘算力,助力用户智能化创新

近期,AI 创新圈再次发布重磅产品更新。OpenAI 全新旗舰版多模态模型 GPT-4o 横空出世,其打通文本、图像、视频的富媒体理解能力以及敏捷的智能化对话,将 AI 助手的人性化表达效果,提升至更高水平。 ​ 从技术源头来看&#xff0c…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。括号匹配。 二、…

《大模型应用开发极简入门》学习成为善用 AI 的人!看完懂得90%的大模型!{含pdf版电子书}

📖《大模型应用开发极简入门:基于GPT-4与ChatGPT》 真心建议学习大模型的朋友都去看看这本书,作为一本应用开发入门书,在豆瓣评分好评不断,其中知识点有不少值得深入研究的领域,适合小白初学者阅读学习的&…

【Google Maps JavaScript API】详解地图本地化(Localizing the Map)

文章目录 一、地图本地化概述1. 什么是地图本地化?2. 为什么需要地图本地化? 二、如何实现地图本地化?1. 准备工作2. 编写 HTML 文件3. 初始化地图 三、详细代码解析1. HTML 部分2. JavaScript 部分 四、如何在本地运行示例代码?五…

Spring Boot如何压缩Json并写入redis?

1.为什么需要压缩json? 由于业务需要,存入redis中的缓存数据过大,占用了10G的内存,内存作为重要资源,需要优化一下大对象缓存,采用gzip压缩存储,可以将 redis 的 kv 对大小缩小大约 7-8 倍&…

Jmeter录制脚本(不推荐,因为有大量冗余)

1、以百度举例 2、选择“Requests Filtering”,在“包含模式”中填入“.(baidu\.com).”用以过滤非http://baidu.com的请求; 同时在“排除模式”中填入“(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2|htm|html).”用以过滤js、图片、html等…

postman请求设置

postman请求设置 1、请求参数,只能是none、for-data、x-www...、raw等中的一个,不能多个。2、请求头类型3、案例4、测压 1、请求参数,只能是none、for-data、x-www…、raw等中的一个,不能多个。 2、请求头类型 根据请求头&#x…

用Python分析定性变量之间的相关性_对应分析模板

对应分析是一种多元统计分析方法,主要用于分析定性变量构成的列联表,揭示变量之间的关系。它通过将列联表中的数据转换为点的形式,在低维空间中表示出来,从而实现数据的可视化。这种方法特别适用于有多个类别的定性变量分析&#…

如何将开发工具设置成滚动鼠标改变字体大小

就在刚刚与温州那边技术开会,温州那边技术提出:字体太小,代码看不清,需要将字体放大。然后让我将IDE设置成按住键盘的Ctrl滚动鼠标,可以放大字体大小。。。顿时间的小小尴尬。下面我来记录一下究竟是怎么操作的&#x…

Excel 导入和导出--前后端整合

文章目录 Excel基础Easy Excel导出会员数据导入会员数据 前端代码:代码解析总结组件简介详细解释总结 用来操作excel文件的。银行网银系统导出交易明细数据、各种业务系统导出excel报表数据、批量导入业务数据。 Excel基础 **工作簿 workbook**就是一个文件工作表 sheet属于…

element的el-date-picker组件实现只显示年月日时分,不显示秒

需求&#xff1a;使用element的el-date-picker组件&#xff0c;只显示时分&#xff0c;不消失秒 效果&#xff1a; 解决方法&#xff1a; <el-date-pickerv-model"ruleForm.startTime"type"datetime"placeholder"开始时间"format"yyyy-…

萌化人心!AI宠物视频,1条视频涨粉1W+,千万级播放量(附教程)

大家晚上好&#xff0c;今天给大家分享一个创意玩法—用AI 生成超萌动物&#xff0c;打造宠物互动虚拟场景。 这种视频内容非常受欢迎&#xff0c;吸引了大量观众。某音上有位博主通过这种创新方式迅速构建了AI宠物系列账号&#xff0c;短时间内便积累了大量粉丝。 比如这条视…

【前端】控制台彩蛋彩色键盘

效果如图 代码如下 const colors {reset: "\x1b[0m",red: "\x1b[31m",green: "\x1b[32m",yellow: "\x1b[33m",blue: "\x1b[34m",magenta: "\x1b[35m",cyan: "\x1b[36m",white: "\x1b[37m"…

神经网络算法 - 一文搞懂 Softmax 函数

本文将从Softmax的本质、Softmax的原理、Softmax的应用三个方面&#xff0c;带您一文搞懂 Softmax 函数。 Softmax激活函数 Softmax一般用来作为神经网络的最后一层&#xff0c;用于多分类问题的输出。其本质是一种激活函数&#xff0c;将一个数值向量归一化为一个概率分布向量…

《机器学习》 SVM支持向量机 推导、参数解析、可视化实现

目录 一、SVM支持向量机 1、什么是SVM 例如&#xff1a; 2、SVM的主要特点是&#xff1a; 二、SVM方程 1、超平面方程 2、标签问题 3、决策函数&#xff1a; 符号函数&#xff1a; 整合&#xff1a; 4、距离问题 1&#xff09;点到直线距离 2&#xff09;点到平面…

Python使用Tesseract OCR识别文字

Tesseract-OCR是一款由Google维护的开源光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;它能够从图像中识别出文本&#xff0c;并将其转换为可编辑的文本格式。以下是关于Tesseract-OCR的详细介绍&#xff1a; 一、背景与发展 起源&#xff1a;Tesseract最初是惠普…

5G Hz WiFi 频段划分

5GHz WiFi频段被划分为多个Band&#xff0c;这主要是基于国际通信标准和各国监管机构的规定。在常见的划分中&#xff0c;5GHz频段被分为以下几个部分&#xff1a; Band 1 (U-NII-1): 频率范围为5.15~5.25GHz&#xff0c;带宽为100MHz。Band 2 (U-NII-2 或 U-NII-2A/2C): 通常…

Visual Studio Code 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开首选项设置对话框2. 在Font Family里面输入字体 前言 Visual Studio Code 自定义字体大小&#xff0c;统一设置为 Cascadia Code SemiBold &#xff0c;大小为 14 具体操作 【文件】>【首选项】>【设置】&…