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 …

《知识扫盲》什么是动态库、静态库、共享库?

共享库(Shared Library)、动态库(Dynamic Library)和静态库(Static Library)是三种不同的库文件,它们在编程中有不同的作用和使用方式。 静态库: 静态库是一组预编译的对象文件的集合…

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 相关部署这里不做赘述,只要创…

数据库触发器trigger 的应用

文章目录 1. 什么是触发器(trigger)?2. 触发器的种类2.1 DML 触发器2.2 DDL 触发器2.3 登录触发器 3. 触发器的优点4. 触发器的缺点5. 应用示例5.1 触发器的创建5.2 删除触发器 1. 什么是触发器(trigger)? 在某种操作执行的同时触发另一种操作。它的执…

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

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

关于图片复制出现拒绝访问的问题探讨

最近看到一个个bug一个图片无法实现复制,代码是这样的 package demo.demo18.Test; import java.io.*; public class test1 { public static void main(String[] args) throws IOException { try ( //需求:复制照片 //1.创建一个字节输入流管道与源文件接…

雷达遮挡检测综述

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

WiFi7: EMLSR操作之一 -- 概述

原文:EMLSR操作能够允许非AP MLD使用一个或以上的link侦听初始控制帧,该控制帧由AP MLD以non-HT(dup)格式发送,并在接下来在同一Link进行帧交换。 非AP MLD在处于EMLSR模式时受EMLSR模式限制。 AP MLD在dot11EHTEMLSROptionActi…

每天刷两道题——第四天

1.1最大子数组和 给一个整数数组 nums ,找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,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…

RSA非对称加密学习

设计方案: 单位生成密钥对: 每个单位(A、B、C、D等)生成自己的 RSA 密钥对,包括一个私钥和一个对应的公钥。 A单位加密数据: 单位A作为数据加密方,使用其他单位的公钥对数据进行加密。 其他单…

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

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

Reservoir sampling algorithm--蓄水池抽样算法的理解

一、算法代码: def reservoir(num_seen_examples: int, buffer_size: int) -> int:"""Reservoir sampling algorithm.:param num_seen_examples: the number of seen examples:param buffer_size: the maximum buffer size:return: the target i…

springboot/spring cloud 手动控制事务提交

1、背景:定时器定时从数据库中拉取数据进行分组处理,每一组如果有任意一个异常导致失败,该组操作事务只能回滚。所以在循环中每一次大循环是一个事务,大循环中的其它小循环中任意一个异常都会回滚处理。 2、service中引入spring的…

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

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