当前位置: 首页 > news >正文

Linux中如何理解一切皆文件

根据之前的学习我们会有一些少许的疑惑,我们的stdin ,stdout,stderr访问的是键盘显示器,然而键盘显示器等他们都有一个共同的特点就是他们都是外设,那么这些外设是怎么被看成是文件的呢?

看图可以知道硬件的上一层链接着一个驱动程序,操作系统通过构建一个struct device 的结构体来描述这一类的外设:

然后每个外设都有一个device这样的结构体对象,操作系统通过链表把这些device连接起来:所以操作系统对设备的管理转化成了对数据结构的增删查改:

然后device中的属性则是由外设的驱动来初始化:

这样将外设结合起来,可以看到他们的属性类别都是一样的,值可以不同,但是IO的方法是不同的,读键盘就是读键盘,读显示器就是读显示器,他们没有任何关系

我们拿键盘举例子,键盘目前只有读取方法,但是没有写方法,往键盘里写东西感觉都是不太对的,所以把写键盘设置为空方法,其他的类推:

可以看到,他们的方法虽然不一样,但是他们都需要有读写,所以在操作系统启动的时候就会创建struct file对象,里面包含了相关文件相关属性等等我们不关心,重点是file里含有两个函数指针,那两个函数指针分别指向外设的read和write方法:

可以看到用函数指针屏蔽了文件硬件的差异

从file的角度来看我们要读写外设,我们就不关心下面的蓝色字体实现的方法,然后从file的角度往上看,我们访问外设,就只关心外设的读和写,甚至不用关系底层的设备是什么,file会自动帮我们找到对应的设备读写。

所以,相当于在操作系统中对外设做了一层封装,让我们看到的一切皆文件:

这一套机制在Linux当中叫vfs(虚拟文件系统)

其中实现这一机制就类似于c++中多态:

之不过c面向过程写的方式不一样。

所以系统是通过什么方式来让我们看到struct file的呢?是通过文件描述符来让进程看到struct file的

http://www.lryc.cn/news/467327.html

相关文章:

  • 【贪心算法】(第十一篇)
  • React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode
  • 深入解析 Jenkins 自动化任务链:三大方法实现任务间依赖与状态控制
  • 无人机飞手执照培训为什么需要脱产学习?
  • PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程
  • uniapp使用webView打开的网页有缓存如何解决(APP,微信小程序)
  • HarmonyOS 模块化设计
  • 解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题
  • duilib的应用 在双屏异分辨率的显示器上 运行显示不出来
  • 零代码快速开发智能体 |甘肃旅游通
  • 【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • qt获取本地语言
  • 【Spring篇】Spring中的Bean管理
  • UV灯 VS LED灯,LED美甲灯是紫外线灯吗?
  • 得物App3D博物馆亮相“两博会”,正品保障助力消费体验升级
  • rancher安装并快速部署k8s 管理集群工具
  • NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置
  • 八、Linux 系统安全:守护你的数字堡垒
  • PTA数据库编程练习合集
  • 分布式链路追踪-01初步认识SkyWalking
  • openpnp - 底部相机视觉识别CvPipeLine的参数bug修正
  • C#从零开始学习(接口,强制转化和is)(7)
  • 算法Day-8
  • 屏蔽小米电视广告的方法
  • C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser
  • 玩转PyCharm:常用操作和快捷键
  • HeterGCL 论文写作分析
  • 简单的windows java -jar 无法启动jar包解决方法
  • iPhone图片/照片/视频复制到win10系统的简单方法 - 照片导出
  • ctfshow-文件上传-151-161