文件系统 -文件的基本了解

news2024/11/16 19:58:11

文章目录

  • 一、文件的基本了解
    • 1. 文件 = 内容 + 属性
    • 2. 文件被访问之前,要被打开
    • 3. 谁在打开文件?
  • 二、fopen()
    • w 方式打开文件
      • ① 基本使用:
      • ② 标准重定向:
    • a 方式打开文件
      • ① 基本使用:
      • ② 重定向:
    • fopen()定位文件
  • 三、默认打开的文件流
  • 四、文件描述符
    • 描述文件的结构体
      • ① 硬件提供各自的操作方法
      • ② 使用结构体描述硬件,并管理起来
      • ③ VFS:虚拟文件系统
    • 文件描述符的存在

一、文件的基本了解

1. 文件 = 内容 + 属性

文件由内容和属性组成。
文件的权限,创建时间,拥有者等都是文件的属性,如下:
在这里插入图片描述
文件中写了些什么,就属于文件的内容了。
在这里插入图片描述

2. 文件被访问之前,要被打开

在这里插入图片描述
那么为什么要将文件加载到内存中呢?—— 文件必须被加载到内存中,这样 CPU 才能通过执行代码来修改它。
在这里插入图片描述
所以按照文件是否被加载到内存中,可以将文件分类:内存文件(被打开的),磁盘文件(未被打开的)。

3. 谁在打开文件?

是进程在打开文件。代码中有 fopen() 等函数,该程序形成进程后,CPU 调度该进程,执行到 fopen() 后才打开文件。
那么,一个进程是可以打开多个文件的,一段时间内,系统中又会有很多进程,所以系统需要将这些进程打开的文件进行管理,方法是:先描述,后组织。
在这里插入图片描述

  • 先描述:使用一个结构体/类来描述文件(struct file),里面成员是文件的各种属性等,然后就可以创建具体的类对象来代表某个文件了。
  • 再组织:将所有文件的类对象使用某种数据结构链接起来。

这样,进程和文件的关系就变为了 task_structstruct file 之间的关系,对文件的管理就变成对它的数据结构的增删查改了。

二、fopen()

fopen() 函数是一个用来打开文件的函数。
在这里插入图片描述

它的两个参数:

  • filename:文件名。看你要打开哪个文件。
  • mode:打开方式。看你是要 “只读” 打开呢,还是 “又读又写” 打开。

mode 总计是有 6 种可选择的,如下:

在这里插入图片描述

下面我们从两个基本的方式 “w”“r” 方式来看一下 fopen() 函数的基本使用。

w 方式打开文件

以该方式打开一个文件的情况是:(创建)+ 清空 + 写入。
如果要打开的文件存在就打开,不存在就创建一个再打开,然后将文件内容清空,再写入内容。

① 基本使用:

首先我们来看 file.txt(这个是我们要操作的文件)里面的内容,是有内容的:
cat + 文件名 该指令可以查看文件内容)
在这里插入图片描述
然后我们查看一下 test.c 文件(源文件)的内容:

在这里插入图片描述

然后我们将 test.c 文件编译成可执行程序 test,并运行:
在这里插入图片描述

从上面我们可以看到对 file.txt 文件以 w 方式进行打开后, file.txt 文件中原本的内容 #include<stdio.h> 没有了,而是重新写入的 hello zzz

② 标准重定向:

标准重定向写入时,其实是以 w 方式打开的,所以标准重定向每次也会对文件进行清空。
在这里插入图片描述

a 方式打开文件

以该方式打开一个文件的情况是:(创建)+ 追加。
如果要打开的文件存在就打开,不存在就创建一个再打开,然后直接在文件内容基础上,写入内容。

① 基本使用:

查看 test.c 文件中的内容,是以 a 方式打开的:

在这里插入图片描述
然后运行程序,我们可以看到 file.txt 文件前后内容上是添加了 hello zzz 的,是直接在原本的内容基础上追加的,而不是清空后再写入的:

在这里插入图片描述

② 重定向:

重定向其实是以 a 方式打开的文件,进行了追加:

在这里插入图片描述

fopen()定位文件

在这里插入图片描述

  • 如果 filename 参数种没有路径,只是一个文件名的话,就在【当前路径】下查找文件,没有的话就新建一个。
    进程在启动时,会自动记录自己启动时所在的路径,这就是【当前路径】。
  • 如果 filename 参数种带了路径,那就在【所给路径】下查找或创建文件。
    所以如果不想在当前路径下创建文件的话,可以在 fopen() 中写上路径。

示例:
在这里插入图片描述
该程序会在上级路径下创建一个 f.txt 的文件,并写入 hello zzz ,我们来看一下:

在这里插入图片描述

三、默认打开的文件流

系统会默认打开三个文件:stdin(标准输入), stdout(标准输出), stderr(标准错误)。
在这里插入图片描述
在这里插入图片描述

四、文件描述符

描述文件的结构体

① 硬件提供各自的操作方法

不同设备的操作方法是不同的,但都会提供操作的函数:
在这里插入图片描述

② 使用结构体描述硬件,并管理起来

每种硬件都用统一的结构体对象描述,这样就可以统一的管理这些硬件了,将这些对象使用某种数据结构链接起来,对这些硬件的管理就可以转变为对数据结构的增删查改了。
在这里插入图片描述

③ VFS:虚拟文件系统

VFSLinux 内核的一个软件层,提供了一个统一的文件模型,使应用程序能够访问不同的文件系统和设备。
在这里插入图片描述

文件描述符的存在

那么文件描述符是什么呢,在哪里存在呢,有什么作用呢?我们来看一下整体结构:
在这里插入图片描述

  • 上文已经说过了,系统会对进程打开的文件尽心管理,所以上图的右侧就是文件管理部分,操作系统管理的文件列表,使用统一的结构体描述的不同硬件文件,在文件被加载到内存上后,就会被放到操作系统管理的文件列表中。
  • 当文件被加载到内存后,我们怎么知道是哪个进程需要的这个文件呢?—— 通过文件描述符表。我们看上图的左侧,当我们某个进程打开某个文件后,该文件就被会添加到进程的文件描述符表中,通过指针指示,进程就可以找到加载后的文件了。
  • 从图中我们还可以看到,文件描述符表其实是个数组,是个数组的话那就会有下标,该下标就是文件描述符。同时数组中的 012 位置其实分别指向的是键盘、显示器、显示器,其实是 stdinstdoutstderr 三个文件,也就是上面我们所提到的默认打开的三个文件流,默认打开其实就是每个进程创建时,文件描述符表的前三个位置就已经有数据了,就是那三个文件,当然这三个文件也是可以手动关闭的。

因为文件描述符(数组下标)和进程打开的文件对应,所以在上层可以使用文件描述符 fd 来代表该进程打开的文件。
在这里插入图片描述


本文到这里就结束了,如果对您有帮助,希望得到您的一个赞!🌷
如有错漏,欢迎指正!😄

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

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

相关文章

Runtime:源码解析Golang 的map实现原理

go version 1.15.6 map作为一种常见的 key-value 数据结构&#xff0c;不同语言的实现原理基本差不多。首先在系统里分配一段连接的内存地址作为数组&#xff0c;然后通过对map键进行hash算法(最终将键转换成了一个整型数字)定位到不同的桶bucket(数组的索引位置)&#xff0c;然…

【国产游戏行业的崛起与挑战:技术革新与全球市场机遇】

近年来&#xff0c;国产游戏行业确实取得了显著的发展&#xff0c;不仅在技术水平上不断提升&#xff0c;而且在国际市场上也崭露头角。然而&#xff0c;面对全球游戏市场的激烈竞争&#xff0c;国产游戏技术仍面临一些挑战和机遇。 首先&#xff0c;国产游戏在原创IP方面存在…

Autodesk系列软件批量激活工具出现许可证管理器版本不被支持问题解决方案!

使用Autodesk系列软件批量激活工具时&#xff0c;如果出现许可证管理器版本不被支持。 解决办法&#xff1a; 1、确定您安装的最高Autodesk软件版本。 例如&#xff0c;如果您同时安装了AutoCAD2020和Inventor 2022,那么您应该下载2022版对应的AdskLicensing。 说明&#xf…

汽车信息安全--攻破SecOC,就在今天!

目录 1.SecOC和系统安全&#xff1f; 2.破解实录 2.1 破解安全访问授权 2.2 程序控制的漏洞 3.小结 2020年左右&#xff0c;汽车信息安全开始在业内普及。 对于这种新概念&#xff0c;部分OEM仍采取以往开发模式&#xff0c;在不影响软件架构的大背景下&#xff0c;直接进…

企业级NoSql数据库Redis集群

一、关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 …

OpenHarmony中的fastjson gson应该这样用

【问题背景】 随着越来越多的开发者开始投入北向应用的开发&#xff0c;无数的人开始问我&#xff1a;鸿蒙三方库是否有fastjson&#xff0c;是否有gson&#xff0c;当前json和对象的转换要怎么搞。 作为程序员&#xff0c;我的每个项目都逃不掉fastjson/gson等三方库&#x…

C++基础知识5 string

string 1. string类1.1 C语言中的字符串 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for2.3 string类的常用接口说明 3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数6. vs和g下string结构的说明7. string类的模拟实现8.写时拷贝(…

认知杂谈35

今天分享 有人说的一段争议性的话 I 《日常藏宝&#xff0c;多留意》 嘿&#xff0c;你想想看哈&#xff0c;生活里那些让咱佩服得不行的小窍门&#xff0c;其实都藏在咱平常的小事儿里呢。 I 就好比啊&#xff0c;很多有用的道理其实就在咱身边晃悠&#xff0c;就看咱有没有…

nginx访问控制、用户认证、https

nginx访问控制 用于location段 Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开 Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开 //deny [rootnginx ~]# vim /usr/local/nginx/conf/nginx.conflocation /stat…

【数据结构篇】~链式二叉树(附源码)

链式二叉树 前言&#xff08;含头文件&#xff09;头文件 1.链式二叉树的组成2.前、中、后、层序遍历1.前序遍历2.中序遍历3.后序遍历 3.结点个数以及高度等​4.判断二叉树是否为完全二叉树 前言&#xff08;含头文件&#xff09; 之前的堆是特殊的二叉树是顺序结构的二叉树&a…

python库(20):Jsonschema库描述JSON数据的规范

1 Jsonschema简介 在当今信息时代&#xff0c;数据规范与交换变得越来越重要&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络通信与前后端数据交互。 JSON Schema是一种用于描述JSON数据的规范…

计算机二级题--函数(scanf)章节

1.scanf函数 1. 2. A:默认使用scanf函数的时候&#xff0c;如果空格&#xff0c;回车或跳格就结束了&#xff0c;不能再继续输入了 (同上知识点&#xff09;

【JavaEE初阶】HTTP协议与使用Fiddler抓包

目录 &#x1f38d;HTTP协议是什么&#xff1f; &#x1f340;应用层协议&#xff08;HTTP&#xff09;存在的意义 &#x1f384;HTTP 协议的工作过程 &#x1f334;HTTP 协议格式 &#x1f333;Fiddler抓包工具的使用 &#x1f6a9;如何抓HTTPS的包&#xff1f; &#…

“视频号小店分销:让你的微信小店也能分销”

在数字时代的浪潮中&#xff0c;微信视频号利用其深厚的社交根基和庞大的用户基础&#xff0c;正逐渐成为新零售领域的一股新兴力量。特别是其视频号小店功能的推出&#xff0c;为商家提供了一个集商品展示、销售促进和营销策略于一体的全方位运营平台&#xff0c;实现了业务流…

医疗器械法规笔记

目录 前言医疗器械法规体系医疗器械监管注册与备案前言 之前的文章中介绍了与软件开发过程中相关的法规(网络安全),同时介绍了如何查找相关行业标准,这些都是平时工作中遇到的细节问题,没有系统性的呈现出医疗器械法规相关的框架,一直想对法规与标准有一个全面的认识和总…

java之继承与多态 1

1.继承的概念&#xff1a;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法&#xff0c;从而实现代码的重用和扩展。 父类&#xff08;超类&#xff09;&#xff1a;被继承的类。子类&#xff1a;继承父类的类。子类可以访问父…

OpenHarmony实战开发:Launcher应用安装问题分析报告

1 关键字 Launcher&#xff1b;Storage 2 问题描述 问题现象&#xff1a;安装应用到达 20 个以上后&#xff0c;重启设备&#xff0c;Launcher 页面没有任何应用图标 运行环境&#xff1a;硬件 dayu200&#xff0c;软件&#xff1a;3.1release 测试步骤&#xff1a; 使用…

DrawDB数据库设计工具本地部署结合内网穿透实现团队异地协作办公

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言…

Redis集群技术

目录 一、Redis安装部署 二、Redis主从复制 三、Redis哨兵模式 1、开启Redis哨兵模式 2、Redis哨兵模式选举MASTER全过程 3、Redis哨兵模式数据丢失风险的解决方案 四、Redis Cluster 1、Redis集群部署 2、Redis集群扩容 1、加入MASTER集群 2、分配槽位 3、添加slav…

Linux:开发工具(3)

一、版本控制器git 安装git指令 yum install git 1.1 举例理解版本控制器 举个例子&#xff1a; 比方说老师要求我们交一份实验报告&#xff0c;而你的室友张三是一个非常勤奋的人&#xff0c;所以他很早就写好了第一版交给老师&#xff0c;但老师的要求很高&#xff0c;他觉得…