IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> OS管理文件的方式(文件读写的过程) -> 正文阅读

[系统运维]OS管理文件的方式(文件读写的过程)

一个进程可以打开/创建多个文件,即 进程:打开的文件 = 1:n

OS中存在多个进程,那就说明可能存在更多文件

所以,OS必须对进程中打开的文件进行管理

在了解文件如何被管理之前,我们需要先了解 文件是以何种形式存在于操作系统上的??


目录

一、文件的存储方式

1、文件的一般存储形式

2、文件的数据化存储形式

?二、进程与struct file的关系

三、文件描述符0、1、2

四、文件结构体struct file如何跟底层驱动打交道?

五、总结:文件读写的过程


一、文件的存储方式

1、文件的一般存储形式

我们在平时看到的文件诸如

?但是这只是Windows上表现出来的形式

?这是Linux上文件的表现形式,通常这些文件是放在磁盘上的

问:一个空文件(0KB的文件) 是否会占据磁盘空间??

答:会的,无论是Windows还是Linux系统,文件一旦被创建,就会有文件的创建时间、文件权限等属性信息,这些信息都需要地方存放

所以!!!磁盘文件 = 文件内容 + 文件属性

2、文件的数据化存储形式

一个文件包含文件内容和文件属性信息,这些信息都会被存放在一个结构体 struct file中

对于多个文件,就以双链表的形式相互联系起来

?二、进程与struct file的关系

文件这么多,哪些是属于当前进程的呢??

进程的task_struct中包含一个 struct files来专门管理当前进程的文件(左图)

struct files包含的指针数组 fd_array[ ]存放着各个文件的地址,通过这些地址我们可以找到对应的文件(右图)

? ? ? ? ??? ? ? ?

数组中存放着 struct file类型的指针,也就是 存放文件信息结构体struct file的地址

每一个地址都能对应到一个文件结构体

?

三、文件描述符0、1、2

在上一篇的系统调用函数中open函数的返回值是文件描述符 fd

?

每创建一个文件,就会对应一个文件描述符,这个文件描述符很容易让我们联想到数组的下标

没错,上面 指针数组的下标 = 文件描述符

问:为什么是从3开始的?

答:C在运行程序之前,会自动打开三个输入输出流,分别是stdin、stdout、stderr

stdin(标准输入)? :键盘,下标是0(文件描述符fd = 0)

stdout(标准输出):显示器,下标是1(文件描述符fd = 1)

stderr(标准错误):显示器,下标是2(文件描述符fd = 2)

既然stdout相当于显示器文件,那么我们直接向这个文件写入数据,是不是就会打印出来呢?

答案是 可以的!!

?

四、文件结构体struct file如何跟底层驱动打交道?

键盘、显示器、磁盘、网卡等都属于外设,内存和这些外设打交道,无非就是I/O

为了和这些外设打交道,OS提供了系统调用函数read、write函数

(虽然键盘不能写,但是为了统一,键盘的write函数的函数体为空;显示器的read函数也是如此)

?

每一个外设的read、write函数都不一样,为什么我们平时用的read/write函数都是一样的??

这就涉及到多态,我们先通过简单的例子理解

假设现在有Animal类、Cat类、Dog类

//猫
class Cat: public Animal
{
public:
    void run() {? cout<<"cat can run"<<endl; }
    void eat() {? cout<<"cat can eat"<<endl; }
}

//狗
class Dog: public Animal
{
public:
    void run() {? cout<<"dog can run"<<endl; }
    void eat() {? cout<<"dog can eat"<<endl; }
}

我们只需要通过Animal的对象,既能调用Cat的run函数,又能调用Dog的run函数

????????Animal* animal = new Cat();? ? ? ? ? ? //可以调用Cat类的run函数

????????Animal* animal = new Dog();? ? ? ? ? ? //可以调用Dog类的run函数? ?

Cat类的run函数——》键盘的read函数,Dog类的run函数——》网卡的read函数

在上层设计一个总的read,就能通过一个接口调用不同的函数

?

五、总结:文件读写的过程

从上层到硬件,我们整理一下整个过程

假设上层调用了read函数

char* buffer[1024];
read(0,buffer,sizeof(buffer));

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:51:11  更:2022-04-04 12:51:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:53:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码