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.rhkb.cn/news/410894.html

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

相关文章

使用代理和 Python 高效进行亚马逊数据抓取: 实用指南

文章目录 一、简介二、为什么要抓取亚马逊?三、了解代理3. 1. 搜索亚马逊的代理类型 四、为什么使用 Python?五、设置5. 1. 选择代理5. 2. 设置代理 六、抓取数据七、解析数据八、 结论 一、简介 在现代数字环境中,分析网络流量对于优化网站…

YOLOv10:实时端到端目标检测

摘要 https://arxiv.org/pdf/2405.14458 近年来,YOLO系列模型因其在计算成本与检测性能之间的有效平衡,在实时目标检测领域占据了主导地位。研究人员在YOLO的架构设计、优化目标、数据增强策略等方面进行了探索,并取得了显著进展。然而&…

RabbitMQ的基础概念介绍

MQ的三大特点:削峰、异步、解耦 1.RabblitMQ概念介绍 1.1概念 RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息…

【管理型文档】软件需求管理过程(原件)

软件需求管理规程应明确需求收集、分析、确认、变更控制及验证等流程,确保需求准确反映用户期望,支撑软件开发。该规程要求系统记录需求来源,通过评审确保需求完整、清晰、无歧义,实施变更控制以维护需求基线稳定,并持…

JVM类加载机制—类加载器和双亲委派机制详解

一、概述 上篇我们介绍了JVM类加载机制—JVM类加载过程,类加载过程是类加载机制第一阶段,这一阶段主要做将类的字节码(class文件)加载JVM内存模型中,并转换为JVM内部的数据结构(如java.lang.Class实例&…

软件测试——自动化测试selenium常用函数

目录 元素的定位cssSelectorxpath函数 操作测试对象窗口切换窗口窗口设置大小窗口切换屏幕截图关闭窗口 等待强制等待隐式等待显示等待 浏览器导航弹窗警告弹窗确认弹窗提示弹窗 文件上传浏览器参数设置 元素的定位 web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素&#xff0…

【操作系统】14.I/O设备怎么分配和回收?

5.2 I/O设备怎么分配和回收? 5.2.1 I/O核心子系统 I/O调度 设备保护 假脱机技术(SPOOLing技术) ​ 输入井和输出井 ​ 输入进程和输出进程 ​ 输入缓冲区和输出缓冲区 设备分配与回收 ​ 设备分配应考虑的因素 ​ 静态分配与动态分配 ​ 设备…

上传文件(用户导入),第二次选择文件时没有反应(可用)

https://gitee.com/y_project/RuoYi-Cloud/issues/I582YB PS:恰好我使用的版本是 支持 handleRemove ,所以很容易就解决了

企业如何选型人力资源管理系统?(附HR系统对比分析)

随着企业规模的扩大,人力资源管理系统成为了大中型企业不可或缺的工具。近年来,众多新技术产品层出不穷,这些技术和产品的实际功能和适用性并不明确,大量的新概念和新厂商通过各种渠道宣传,市场上信息过载使得企业难以…

美畅物联丨物联网平台的标准化之路:物模型设计的创新及应用

随着物联网(IoT)技术以前所未有的迅猛之势蓬勃发展,海量的物联网终端与应用纷纷接入,这不可避免地引发了数据与应用层面的异构化难题,进而形成了复杂且多变的碎片化问题。物联网感知数据因其具备多源异构的显著特性&am…

Linux中的常见命令——时间日期类命令

1、date显示当前时间 基本语法 写法功能描述date显示当前时间date %Y显示当前年份【四位数】date %m显示当前月份date %d显示当前是哪一天date "%Y-%m-%d %H:%M:%S" 显示年月日时分秒 【由于年月日和时分秒中间有空格所以需要用引号引起来】 实操案例 1、显示当…

【VUE入门级温故知新】一文向您详细介绍~组件属性Props(选项式API)

大家好,我是DX3906 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇 前面和大家分享了《如何从零开始创建一个 Vue 应用》 《VUE模板语法(超详细讲解)》 《一文向您详细介绍~Vu…

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

并发服务器---IO多路复用

单循环服务器&#xff1a;同一时刻只能处理一个客户端任务 并发服务器&#xff1a; 同一时刻&#xff0c;只能处理多个客户端的任务 实现方法&#xff1a;多进程 多线程 IO多路复用 IO多路复用&#xff1a; 1.阻塞io&#xff08;fgets scanf recv getchar read&#x…

算法的学习笔记—数据流中的中位数(牛客JZ41)

&#x1f600;前言 在处理动态数据时&#xff0c;实时计算中位数是一个经典问题。中位数是排序后处于中间位置的数值&#xff0c;数据流中的中位数计算面临两个挑战&#xff1a;首先是数据量的动态变化&#xff0c;其次是需要保持元素的有序性。为了高效地解决这个问题&#xf…

并发式服务器

并发式服务器是一种设计用来同时处理多个客户端请求的服务器。这种服务器能够提高资源利用率和响应速度&#xff0c;适用于需要服务大量用户的网络应用。以下是并发式服务器的一些关键特点&#xff1a; 多任务处理&#xff1a;并发式服务器能够同时处理多个任务或请求&#xff…

DDOS攻击学习-渗透测试-域名信息收集

文章目录 wordpress漏洞利用域名信息收集域名介绍域名分类 whoiswhois反查子域名收集子域名发现网络空间安全搜索引擎SSL证书查询js文件发现子域名 wordpress漏洞利用 这个一般都需要安装wordpress服务使用wpscan扫描&#xff0c;但现在一般很少人知道或者使用wordpress所以这个…

Mysql的查询指令

整理了一些Mysql的查询语句&#xff0c;希望对大家有帮助&#xff0c;祝大家心想事成万事如意&#xff01; 基本查询 select 字段 from 表名 where 条件&#xff1b; 排序查询 select 字段 from 表名 order by 排序字段 [asc升序|desc降序] limit 前几行/中间几行&#xff1…

美股投资迷思大揭秘:理性投资,绕开六大陷阱

你是否也对美股投资充满了期待&#xff0c;但又担心踏入误区&#xff1f;美股市场作为全球金融的璀璨明珠&#xff0c;吸引着无数投资者的目光&#xff0c;但同时也伴随着一些常见的误解。今天&#xff0c;我们就来一一拆解这些迷思&#xff0c;助你美股投资之路更加顺畅&#…

产品中的影响力六大原则

罗伯特B西奥迪尼(Robert B. Cialdini)是全球知名的说服术与影响力研究权威专家。他在著作《影响力&#xff1a;说服心理学》中提出有效的影响和说服必须遵循统一的六项心理学原则&#xff1a;互惠、承诺与一致、社会认同、喜好、权威和稀缺性。不论在生活还工作中我们或多或少会…