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

        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.mzph.cn/web/51562.shtml

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

相关文章

第100+23步 ChatGPT学习:概率校准 Sigmoid Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章:《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

0.0 C语言被我遗忘的知识点

文章目录 位移运算(>>和<<)函数指针函数指针的应用场景 strcmp的返回值合法的c语言实数表示sizeof 数组字符串的储存 —— 字符数组与字符指针字符串可能缺少 \0 的情况 用二维数组储存字符串数组其他储存字符串数组的方法 位移运算(>>和<<) 右移(>…

c++中的匿名对象及内存管理

c中的匿名对象 A a;//a的生命周期在整个main函数中 a.Sum(1); //匿名对象生命周期只有一行&#xff0c;只有这一行会创建对象,出了这一行就会调析构 A().Sum(1);//只有这一行需要这个对象&#xff0c;其他地方不需要。 return 0; 日期到天数的转换 计算日期到天数转换_牛客…

【鸿蒙样式初探】多个组件如何共用同一样式

最近开发鸿蒙&#xff0c;刚接触难免二和尚摸不着头脑&#xff0c;尤其是样式...... 背景 在做银行卡显示的一个小需求时&#xff1a; 每个Text都需要设置fontColor:#FFFFFF" 想着是否可以简单点 解决历程 思路一&#xff1a;&#xff08;拒绝) 使用Styles 提取封装公…

爆改YOLOv8|利用可改变核卷积AKConv改进yolov8-轻量涨点

1&#xff0c;本文介绍 AKConv&#xff08;可改变核卷积&#xff09;是一种改进的卷积操作方法&#xff0c;其核心在于动态调整卷积核的形状和大小。与传统卷积层固定核大小不同&#xff0c;AKConv 通过引入可学习的机制&#xff0c;使卷积核在训练过程中能够自适应地调整&…

学生宿舍管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;宿舍公告管理&#xff0c;学生管理&#xff0c;宿舍管理&#xff0c;后勤人员管理&#xff0c;楼栋信息管理&#xff0c;宿舍分配管理管理&#xff0c;退宿信息管理 微信端账号功能包括&#xff1a;系…

程序猿成长之路之数据挖掘篇——Kmeans聚类算法

Kmeans 是一种可以将一个数据集按照距离&#xff08;相似度&#xff09;划分成不同类别的算法&#xff0c;它无需借助外部标记&#xff0c;因此也是一种无监督学习算法。 什么是聚类 用官方的话说聚类就是将物理或抽象对象的集合分成由类似的对象组成的多个类的过程。用自己的…

idea import配置

简介 本文记录idea中import相关配置&#xff1a;自动导入依赖、自动删除无用依赖、避免自动导入*包 自动导入依赖 在编辑代码时&#xff0c;当只有一个具有匹配名称的可导入声明时&#xff0c;会自动添加导入 File -> Settings -> Editor -> General -> Auto Imp…

简而不减,极致便捷!泰极预付费解决方案震撼上市

开户麻烦!绑表复杂!用电情况模糊!电费收缴难! 在日常生活中,能源缴费可能经常会遇到运维难管理、缴费收益难计算、支付安全难保障等问题。如何解决呢?正泰物联推出“泰极预付费解决方案”,“简”操作,“不减”功能,有效解决上述问题,助力实现便捷生活。 享轻松:泰极简而不减…

MySQL内部临时表(Using temporary)案例详解及优化解决方法

目录 前言 一.场景案例 二、什么是内部临时表&#xff1f; 三、哪些场景会使用内部临时表&#xff1f; 四、内部临时表如何存储&#xff1f; 1&#xff09;使用内存 2&#xff09;先使用内存&#xff0c;再转化成磁盘文件 3&#xff09;直接使用磁盘文件 五、如何优化…

【软件文档】项目总结报告编制模板(Word原件参考)

1. 项目概要 1.1. 项目基本信息 1.2. 项目期间 1.3. 项目成果 1.4. 开发工具和环境 2. 项目工作分析 2.1. 项目需求变更 2.2. 项目计划与进度实施 2.3. 项目总投入情况 2.4. 项目总收益情况 2.5. 项目质量情况 2.6. 风险管理实施情况 3. 经验与教训 3.1. 经验总结…

【异常错误】pycharm可以在terminal中运行,但是无法在run中运行(没有输出错误就停止了)

问题&#xff1a; pycharm的命令可以在terminal中运行&#xff0c;但是复制到无法在run中运行&#xff08;没有输出错误就停止了&#xff09; run中运行后什么错误提示都没有 搞不懂为什么 解决&#xff1a; 降低run中batch-size的大小&#xff0c;即可以运行 我并没有观察到…

Unity(2022.3.41LTS) - 后处理

目录 一、什么是后处理 二、后处理的工作原理 三、后处理的常见效果 四、如何在 Unity 中实现后处理 五、后处理的性能影响 六. 详细效果 一、什么是后处理 后处理是在场景渲染完成后&#xff0c;对最终图像进行的一系列操作。这些操作可以包括调整颜色、添加特效、模糊…

Windows Geth1.14.3私链搭建

geth下载官网&#xff1a;Downloads | go-ethereum 安装完成的目录 安装完后配置环境变量&#xff0c;在终端输入geth version 第一步&#xff1a;第一种创建账户方式geth account new --keystore keystore 创建一个账户&#xff0c;在当前目录下创建一个keystore的子目录&…

Linux工具使用

Linux编辑器-vim使用 1.vim的基本概念 在vim中&#xff0c;主要的三种模式分别是命令模式&#xff0c;插入模式和底行模式。 正常/普通/命令模式(Normal mode) 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;…

一本读懂数据库发展史的书

数据库及其存储技术&#xff0c;一直以来都是基础软件的主力。数据库系统的操作接口标准&#xff0c;也是应用型软件的重要接口&#xff0c;关系重大。 作为最“有感”的系统软件&#xff0c;数据库的历史悠久、品类繁多、创新活跃。 对数据库历史发展的介绍&#xff0c;有利…

CSS3视图过渡动画

概述 网站的主题切换无非就是文字、背景图片或者颜色,我们可以先来看下 Element UI 官网的切换主题的动效: PS:Antdesign UI的主题切换动画也是大同小异。 实现的两种方式 CSS 为主 <script setup> const changeTheme = (e) => {if (document.startViewTransi…

深度学习实用方法 - 选择超参数篇

序言 在深度学习的浩瀚领域中&#xff0c;超参数的选择无疑是通往卓越模型性能的一把关键钥匙。超参数&#xff0c;作为训练前设定的、用于控制学习过程而非通过学习自动获得的参数&#xff0c;如学习率、批量大小、网络层数及节点数等&#xff0c;直接影响着模型的收敛速度、…

MySQL索引(三)

MySQL索引(三) 文章目录 MySQL索引(三)为什么建索引&#xff1f;怎么建立索引为什么不是说索引越多越好什么时候不用索引更好 索引怎么优化索引失效如何解决索引失效 学习网站&#xff1a;https://xiaolincoding.com/ 为什么建索引&#xff1f; 1.索引大大减少了MySQL需要扫描…

线性约束最小方差准则(LCMV)波束形成算法及MATLAB深入仿真分析

阵列信号处理——线性约束最小方差准则(LCMV)波束形成算法及MATLAB深入仿真分析 目录 前言 一、LCMV算法 二、仿真参数设置 三、抗干扰权值计算仿真 四、不同干扰方位下抗干扰性能仿真 五、不同信噪比和干噪比下抗干扰性能仿真 总结 前言 在信号处理模块中&#xff0c;通…