如何理解Linux下一切皆文件

news2024/11/25 6:44:17

文章目录

    • 一、问题抛出
    • 二、如何理解
    • 三、Linux源码验证

一、问题抛出

 Linux中普通文件、目录、字符设备、块设备、网络设备等都被当做文件来对待。虽然他们的类型不同,但是Linux中提供了统一的操作接口。
 普通文件、目录文件显然非常好理解,因此在本文中,我将用最浅显的语言来带大家理解如何将外设当做文件来看待。

二、如何理解

 一个进程中会有各种各样的文件被打开,操作系统要不要统一管理呢?显然是要的。那么如何管理呢?这就不得不提到 Linux 的设计哲学 —— 先描述,在组织

  1. 先描述: 从哲学的高度来说,人是通过属性来认识世界的。例如我一提到 “唱、跳、rap、篮球”,大家想必就知道我在说谁。因此只要描述好对象的属性,我们就可以实现对一个对象的刻画,进而实现管理。Linux是用C语言写的,在C语言中,我们就可以使用结构体来描述对象的所有属性。
  2. 在组织: 假设我们已经使用 file结构体来描述一个文件,那么再使用一定的数据结构,我们就可以将所有文件组织起来。Linux系统是使用链表的结构来组织各个文件的关系的
    在这里插入图片描述

 我们再思考这样的一个问题:可以用C语言来模拟实现C++的类吗? 答案是可以的。你可能会质疑说C语言结构体中不能存在成员函数,但是别忘了,结构体中可以包含函数指针,由此就可以模拟出成员函数的效果。

​ 基于这样的认识,我们不难想象,struct file 中一定会包含文件读写的"成员函数",其伪代码形式如下(fp就像是类中this指针一样):
在这里插入图片描述
 虽然不同设备的读写方式一定都是不一样的(读写不一定都有,没有就提供空函数),但是都要向file结构体提供自己的读写方式。因此 file 结构体能够以统一的视角来看待所有的设备,我们就可以通过使用 file 结构体来统一管理所有的文件
在这里插入图片描述

总结:
 不同外设的底层显然存在差异,但是我们引入一层软件层(虚拟文件系统)屏蔽了底层的差异,提供了相同的操作接口,从而实现统一的管理。

三、Linux源码验证

Linux内核中 struct file 结构体如下:

struct file {
	union {
		struct list_head	fu_list;
		struct rcu_head 	fu_rcuhead;
	} f_u;
	struct path		f_path;
#define f_dentry	f_path.dentry
#define f_vfsmnt	f_path.mnt
	const struct file_operations	*f_op;
	spinlock_t		f_lock;  /* f_ep_links, f_flags, no IRQ */
	atomic_long_t		f_count;
	unsigned int 		f_flags;
	fmode_t			f_mode;
	loff_t			f_pos;
	struct fown_struct	f_owner;
	const struct cred	*f_cred;
	struct file_ra_state	f_ra;
	// 略……
};

 我们观察到其中有 const struct file_operations *f_op成员变量,它就代表着各种操作接口,其中就包含我们之前提到的读写接口(部分内容如下):


struct file_operations {
	struct module *owner;
	loff_t (*llseek) (struct file *, loff_t, int);
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
	// 略 ……
};

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

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

相关文章

今日论文阅读2022-11-10

多模态预训练论文ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasksvision-and-language tasks: visual question answering,visual commonsense reasoning, referring expressions, and caption-based image ret…

基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割

在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型,感兴趣的话可以看下: 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 今天主要是趁着有时间基于deeplabv3来实践裂缝裂痕分割。首先来看效果图: 为了整体直观,这里专门是开…

腾讯蓝鲸 API 网关如何借助 APISIX 实现产品升级与业务完善

分享嘉宾朱雷,腾讯 IEG 运维 PaaS 平台技术负责人。 蓝鲸(全名“蓝鲸智云”)是一套孵化于腾讯 IEG(互动娱乐事业群)内部,服务于多业务与各内部平台的研运一体化 PaaS。 其作用是在 CI、CD 和 CO 三个阶段&a…

Spring 概述

Spring是 Java 应用程序开发框架。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO编程模型来促进良好的编程实践。 Spring Framework Spring 基础框架是 Spring Framework ,基本上任何其他 Spring 项目都是以 Spring Framework 为…

如何进入 mysql?

目录 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t 4. 点回车出现 下面的 就代表已经进入 mysql 退出 mysql的 方法: 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t -u :代表你的用户名,如果是本地登录 则为 -uroot-p &am…

学习python第7天

Python绘制图形库turtle 1.介绍: turtle库根据一组函数指令的控制,在平面坐标系中移动,从 而它爬行的路径上绘制图形。 2.原理:turtle(海龟)由程序控制在画布上游走,走过的轨迹形成绘 制的图形&#xff0c…

子不语IPO下限定价:预计2022年全年净利润下滑,华丙如为实控人

11月10日,子不语集团有限公司(HK:02420,下称“子不语”)在港交所公布发售结果。公告显示,子不语在香港公开发售及国际配售(不含基石部分)阶段均获得超额认购,将于2022年11月11日在港…

【前端】Vue+Element UI案例:通用后台管理系统-登陆页面Login

文章目录目标代码0.路由1.结构2.校验规则3.样式总代码Login.vue效果本篇很短,因为只有一个页面。没有功能。 目标 登陆页面,路由为/login有表单验证 代码 0.路由 在router的index.js文件中的routes中添加对象: {path:/login,component:L…

SpringBoot+Mybatis+CRUD项目

一、项目要求 创建一个 SpringBoot 项目,项目名”week11_学号”;使用 Mybatis 框架,也可以时可用 MybatisPlus 框架;访问 myschool 数据库;对 student 表进行操作,向 student 插入自己的一条记录&#xff…

Linux学习-29-用户组信息相关命令

8.17 Linux groupadd命令:添加用户组 添加用户组的命令是 groupadd,命令格式如下: [rootCncLucZK ~]# groupadd [选项] 组名选项: -g GID:指定组 ID;-r:创建系统群组。-o 一般与-g选项同时使用&#xff0…

C++ opencv 图像色彩空间转换--色域捕获

1.API和相关知识 1.inRange 在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。 关于inRange的提取原理 图像中&#xff0…

这是一篇用python画3D爱心的代码

浅浅写一个最近很火的爱心代码 最近你是否也被李峋的爱心跳动代码所感动,心动不如行动,相同的代码很多,我们今天换一个玩法!构建一个三维的跳动爱心!嗯!这篇博客本着开源的思想!不是说谁对浪漫…

开放服务担心安全?vx-api-gateway值得一用

下载地址:VX-API-Gateway帮助文档 下载解压打开后 Windows 下vx-api-gateway启动 bin目录下start.bat文件 启动后访问http://localhost:5256/ VX-API客户端用于查看VX-API运行的基本信息,管理应用与API及黑名单,打开客户端的方式,在浏览器中请求http://地址:端口…

被生活、房贷车贷压得喘不过气的35岁测试工程师,拿什么来谈追求~

高龄测试员现状 我有位在深圳工作的测试员朋友分享了他的工作经历,他今年35岁,前不久被公司辞退,面对家庭,房贷,车贷的压力,让他的生活都是一片灰,离职后最让测试员感到痛心是在面试多家公司以…

Android Studio App开发之广播组件Broadcast的讲解及实战(包括收发标准、有序、静态广播实现手机震动功能 附源码)

一、收发标准广播 Android的广播机制正式借鉴了Wifi的通信原理,不必搭建专门的通路,就能在发送方与接收方之间建立连接,同时广播也是Android的四大组件之一,它用于Android各组件之间的灵活通信,与活动的区别在于以下几…

荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5,荧光素FITC标记的FRTL-5细胞,FITC-FRTL-5

产品名称:荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5,荧光素FITC标记的FRTL-5细胞 英文名称:FITC-FRTL-5 在F-12培养基中加入5%小牛血清、10mU/ml TSH、10g/ml胰岛素、5g/ml转铁蛋白、10ng/ml生长抑素、0.4ng/ml氢化可的松、10ng/…

JAVA虚拟机的性能监控

一、JDK的命令行工具 命令一:jps(虚拟机进程状况工具) jps -q //只输出LVMID,省略主类的名称(LVMID:虚拟机实例运行时候的进程号) jps -m //输出虚拟机进程启动的时传递给主类main()函数的参…

笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?

随着互联网时代的发展,电脑的应用越来越广泛,已经深深融入了我们的工作乃至生活当中。其中,笔记本作为可随身携带的电脑设备,其灵活、轻便等优势一直深受大家喜爱。在日常使用过程中,我们会往笔记本里存储各式各样的数…

Springboot快速开发-书本信息管理系统(项目源码)

【我后续会发一个资源包,里面是所有代码,数据库表设计也有,大学生可以直接用,导入数据库运行,再导入后端项目和前端项目,再去网页运行就好了,效果图下面有】 1、考核要求: 数据库&am…

笔试强训第22天--(第一个只出现一次的字符 小易的升级之路)

选择 B 从头找和从尾找不都得遍历嘛 B 错了建议给自己来个大嘴巴子 C 老演员了 A 一个从头来,一个从尾来,这样才能全满嘛 A 从1开始存的 但是依然是头指针等于尾指针的时候是空,但是你不留一个空间不存数据,那满的时候也是头指针等…