Linux下一切皆文件

 个人主页:Lei宝啊 

愿所有美好如期而遇


目录

你是否听过Linux下一切皆文件?

在哪里我们体悟到了Linux下一切皆文件?

文件是什么?

在哪里体悟到的?

常见疑惑

怎么办到的Linux下一切皆文件?

我们抛出第一个问题:C语言可以实现面向对象吗?

第二个问题:不同的硬件读写方法相同吗?

第三个问题:如何办到Linux下一切皆文件?

我们最后整体梳理一下流程:


你是否听过Linux下一切皆文件?

刚开始学习Linux的时候,我们从Linux的历史,到学会使用指令入门Linux,到Linux权限理解,到gcc、make、vim、gdb、git等工具的使用,到进程(进程理解,进程创建,进程终止,进程等待,进程替换),再到IO基础等等,我们走过这样的一段路,也许不止一次听过Linux下一切皆文件的说法,也许没有听过这样的说法,不过没关系,接下来我们将会一步步去理解。

在哪里我们体悟到了Linux下一切皆文件?

文件是什么?

既然要说Linux下一切皆文件,首先我们得明白什么是文件,假如我们创建一个文件,但是没有内容,那么这个文件在磁盘占不占空间呢?

答案是占空间的,文件不仅仅只有内容,还有属性,我们在windows下可以看到文件的属性,比如说创建时间,文件大小,位置等等,所以我们应该知道,文件 = 文件内容 + 文件属性

第二个,文件分成两种

  • 磁盘文件(未被打开的)
  • 内存文件(被进程打开)

我们只要不使用文件,那么文件就静静地躺在磁盘里,也就是我们的磁盘文件;但是你要是要访问文件,使用文件, 就得把文件加载进内存,加载进去就没事了吗?要是加载得多了没人管还了得?所以要被操作系统管理,建立struct file,我们也叫他内存文件,包含了磁盘文件的大部分属性以及几乎所有内容。

在哪里体悟到的?

我们初学Linux时,在命令行解释器下敲着一个又一个指令,我们当时只知道,ls,哦,这个指令敲进去,回车,当前工作目录下的所有文件都会显示出来,ls -l,再多显示个选项,但是你问我指令是什么,抱歉,当时我们不知道。

现在再回头去看,Linux下的指令都是C/C++写的可执行程序,可执行程序是什么? 不就是.exe文件?所以指令也就是文件喽,运行时在内存创建task_struct(进程控制块),将.exe文件的数据和代码加载进内存,变成进程,说到底,都是被操作系统管理的文件。

那操作系统是个啥?管理软硬件资源的软件,也就是说,操作系统也是可执行程序喽?我们开机耗费的时间干啥了,不就是将操作系统的可执行程序加载进内存吗?就连操作系统本质上都是文件!

理解了这些,我们就会发现,什么vim,什么gcc,都是可执行程序,都是文件,什么shell,也是文件。

常见疑惑

但是有些问题我就不理解了,你上面说的我都懂,但是你说Linux下一切皆文件,那好,键盘是文件吗?显示器是文件吗?各种外设是文件吗?外设明明是硬件,你怎么能说是文件呢 ?!

stdin,stdout我在学C语言的时候, 常和我说,stdin是标准输入,他对应着键盘,stdout是标准输出,他对应着显示器,那我问你

  • stdin是个啥?
  • stdout是个啥?

这能难倒我嘛,呵,stdin和stdout不就是C标准库提供的变量吗,类型是FILE*,这多简单,那我们接着往下看。

怎么办到的Linux下一切皆文件?

首先,我们得先理解stdin,stdout,stderr(标准错误)是个啥,他是FILE*类型的,那是不是指向FILE类型,FILE类型是什么?他是个结构体,既然是结构体,里面就得封装变量,那么封装了什么呢?我们只提及两个

  • 文件描述符fd
  • 缓冲区
  • (两者详细参考Linux重定向原理,由重定向原理贯穿讲解 进程、文件描述符及缓冲区,这里不是重点,不多说)

(点击看完蓝色字体的文章,到这里当做你已经懂了stdin和stdout),现在我们懂了stdin,stdout,那怎么理解stdin对应着键盘,stdout对应着显示器,而且硬件怎么能被当成文件呢?

我们从Linux的设计哲学来说,原因就体现Linux操作系统的软件设计,Linux是什么写的?C语言。

我们抛出第一个问题:C语言可以实现面向对象吗?

我们从C++这门面向对象的语言来看,他之所以被叫做面向对象,是不是因为有类的存在?那么类包含了什么?

  • 成员属性
  • 成员方法

C语言的struct结构体可以包含成员方法吗?当然是不能的,但是没有别的办法了吗?

当然有,聪明的程序员们使用了函数指针,去指向方法,这就变相实现了面向对象 ,我们看图:

第二个问题:不同的硬件读写方法相同吗?

显示器,键盘,网卡等等都是外设,既然是外部设备,那么就会有读写方式,但是不同的外设,他们的结构都不相同,读写方法当然也就不会相同,所以你显示器有你的read,write方法,我键盘自然也有我自己的read,write方法。

所以不同硬件的read,write方法的实现一定不同!那么这些硬件的读写方法我们叫做什么呢?硬件的驱动方法

所以我们有下图:

第三个问题:如何办到Linux下一切皆文件?

我们说,有一个文件我想读写,首先他被加载进内存,创建了struct file内存文件(这个文件里就包含了磁盘文件的几乎所有内容,不仅仅是属性,而且里面有对应外设的读写方法,即驱动方法),接着将这个结构体的地址填入读写他的进程的files指向的files_struct里的fd_array[]中,给open函数返回了fd,然后有FILE封装fd给用户返回FILE*。

从此,我们就可以对这个文件进行一系列操作了,那么是什么时候我们把磁盘当做文件的,或者说在哪个步骤,我们用户忽略了硬件?

是的,就是在struct file创建的时候,他一但创建返回了fd,我们就可以找到他,之后就可以调用他里面对应硬件的驱动方法去对文件做一系列操作。

也就是说,因为struct file的存在,不管是什么外设,我们也不用管驱动方法是否相同,我只需要找到你的struct file,不管是向内核缓冲区写入(只谈一般情况),还是内核缓冲区里的数据要刷新到对应的硬件上,那都不是我用户该操心的,这都是你操作系统的事情,因为struct file是你操作系统的内核数据结构,关我用户什么事。

至此,我们也就明白,硬件其实一直都是硬件,他当然不是文件,只是我们通过一系列的软件设计,让我们用户不再关心底层,能够统一看待struct file内存文件,对我们用户而言,我不管你底层的东西,对我用户而言,我只要能找到struct file内存文件,那么对硬件的读写就不是问题,这是你操作系统该操心的,我们用户的关心只停留在内存文件,所以我们才说Linux下一切皆文件!

我们最后整体梳理一下流程:
  1. 用户调用fopen
  2. fopen封装了open系统调用
  3. open打开文件返回了fd
  4. FILE*->fileno = fd
  5. 给用户返回FILE*
  6. 用户调用fwrite,传入参数FILE*
  7. fwrite封装了write系统调用
  8. write传入参数FILE*->fileno
  9. 操作系统执行write,操作系统找到调用write的进程
  10. 操作系统找到该进程中的struct files_struct *files
  11. 根据files指针找到files_struct
  12. 在files_struct中找到fd_array[]
  13. 根据fd_array[FILE*->fileno]找到对应的struct file
  14. ----------------------------------------------------------------
  15. 操作系统执行struct file里的驱动方法
  16. 操作系统......

到这里,我们关于Linux下一切皆文件全部讲解完,如果觉得博主写的还可以,点个关注,我们下期再见。

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

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

相关文章

LED显示屏常用驱动芯片一览表

LED显示屏驱动芯片是专门用于驱动LED显示屏的核心芯片,它能够将输入的电信号转化为驱动能力,以控制LED灯的亮度和颜色。LED显示屏驱动芯片具有高可靠性、低功耗、长寿命等优点,是LED显示屏产业的核心零部件之一。 SM16306SJ LED显示屏驱动芯…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

python写入csv文件总是多出一行空行(windows)

问题代码 import csv from os import pathfull_path path.abspath(__file__) path_dir path.dirname(full_path)data [[Name, Age, City],[John, 25, New York],[Alice, 30, Los Angeles],[Bob, 35, Chicago] ] # 代码使用都是正常的,但是总是多出一行空格 with…

Unity游戏资源更新(AB包)

目录 前言: 一、什么是AssetBundle 二、AssetBudle的基本使用 1.AssetBundle打包 2.BuildAssetBundle BuildAssetBundleOptions BuildTarget 示例 3.AssetBundle的加载 LoadFromFile LoadFromMemory LoadFromMemoryAsync UnityWebRequestAsssetBundle 前…

nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控

需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现,比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题 nginx ----> rsyslog ----> kafka —> clickhouse —> grafana 部署 kafka kafka 相关部署这里不做赘述,只要创…

跨境电商代采是什么?怎么做代采网站?

跨境电商独立站就是跨境电商自行搭建的销售网站,服务器、域名都是自主购买的,并由跨境电商独立运营与营销推广。 近些年来,各类第三方电商平台虽然流量大,但是随着进驻电商数量的增加,流量竞争也愈发激烈,…

雷达遮挡检测综述

1 概述 雷达(毫米波、激光)的遮挡是实际项目中比较常见的现象,优秀的算法应当能够及时、准确地检测出雷达是否被遮挡,以及遮挡的严重程度,然后将故障信息发送给诊断系统,并在仪表盘上显示,如…

win系统微软输入法踩坑之输入法

例如:字母间距变宽 或者打字总是繁体等等 字母变宽是因为快捷键误触切换成了全角字符。。 立马打开输入法设置界面进行相关设置(你要解决的输入法问题都可以在这里得到解决):

LED恒流驱动芯片:700V高压线性恒流选型一览表

LED恒流驱动芯片是一种专门用于LED照明产品的电子元件,它能够实现LED的恒流驱动,从而保证LED灯具在工作过程中稳定的亮度和电流输出。其中,700V高压线性恒流是LED恒流驱动芯片的一个重要特性,下面就让我们来详细了解一下。 SM2253…

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃,报错:Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃,报错:Library not loaded: rpath/Ap…

新年新计划,羊大师教你如何实现个人目标与成长

新年新计划,羊大师教你如何实现个人目标与成长 新的一年已经到来,这是一个神奇的时刻,一个全新的开始,也是实现自己目标与成长的最佳时机。在这个瞬息万变的世界中,我们总是被忙碌的生活所迷失,然而我们需…

2023年度回顾:怿星科技的转型与创新

岁月不居,时节如流。随着2023年的落幕,怿星科技在这一年中不仅实现了自身的转型,还在技术创新、产品研发、行业合作和人才培养等方面取得了显著的成就。这一年,怿星科技正式完成了从服务型公司向产品型公司的战略转变,…

为什么选择 IBM LSF?

IBM Spectrum Computing 推出了全面的软件定义基础架构解 决方案产品组合,从而优化资源利用率以缩短成果实现时间并 降低成本,以高效地交付 IT 服务。IBM Spectrum Computing 解决方案非常适合技术和 HPC 应用,旨在简化和加速高性能 仿真和分…

Windows本地如何部署Apache服务器搭配内网穿透实现无公网IP远程访问?

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的,因为tanh函数使得输出值的平均值为0,而sigmoid函数使得输出值的平均值为1/2,对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖

DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣! 北京,2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中,上海数皆智能技术有限公司大放异彩,其创新领先的“智能化客户体验管理CEM&a…

第19届楚天春晚在九省通衢大武汉闪亮登场

——中国明星后代女子歌舞团刘亦菲等兼任形象大使 2024年新年伊始,一场以繁荣中国传统文化为主旨的“楚天春晚”全国文旅活动在湖北武汉拉开帷幕!以“文化强省,旅游大省”为神州特色的联合国世界品牌之都,在辞旧迎新的早春来临之…

kubeadm来快速搭建一个K8S集群

二进制搭建适合大集群,50台以下的主机 kubeadm更适合中下企业的业务集群 我们采用了二进制包搭建出的k8s集群,本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群,kubeadm更适合中小型企业的集群…

RocketMQ 生产者源码分析:DefaultMQProducer、DefaultMQProducerImpl

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

Python 资源大全中文版

文末有链接 资源列表 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 Python 版本管理工具。 pyenv:简单的 Python 版本管理工具。 Vex:可以在虚拟环境中执行命令。 virtualenv:创建独立 Python 环境的工具。 …