【linux】初步认识文件系统

初步认识文件系统

  • 前置知识的简单了解
  • 简单回顾C语言的文件操作
    • stdin&stdout&stderr
  • 系统文件IO
  • open函数的返回值
    • 文件描述符fd
      • 打开文件背后的操作
      • 文件描述符的分配规则

前置知识的简单了解

  1. 文件包括了文件内容和文件属性两个部分(文件内容顾名思义就是文件里面的数据等内容),而文件属性就是文件的相关信息
    在这里插入图片描述
    以上这些信息都是属于文件属性的范畴
  2. 要访问一个文件,必须先将文件打开,不管以什么形式打开文件(不论是编程语言的文件操作还是鼠标双击打开),都是将文件先加载到内存上的一个操作(也就是说在打开文件之前,访问文件的程序就已经运行起来了)
  3. 不论是以什么形式打开一个文件,文件是被进程打开的
  4. 一个进程可以打开多个文件
  5. 在一个时间段内,系统中会存在多个进程,那么也就意味这可能会存在更多的被打开的文件,作为操作系统,肯定是要管理这些被打开的文件。如何管理?(先描述,再组织),也就是说操作系统会去为每一个被打开的文件创建一个结构体,结构体中成员就是文件的各种信息即操作
  6. 不是所有的文件都被进程给打开了,没有被打开的文件被放到了磁盘当中
  7. 被打开的文件通常称为内存文件

简单回顾C语言的文件操作

  如果让你用C语言输出信息到显示器,你有哪些方法?

#include<stdio.h>
#include<string.h>
//分别用不同的方法向屏幕输出内容
int main()
{printf("printf\n");fprintf(stdout,"fprintf\n");fputs("fputs\n",stdout);const char*str="fwrite\n";fwrite(str,strlen(str),1,stdout);return 0;
}

以上程序输出结果为
在这里插入图片描述
  由此可见,虽然使用的不同的函数,但是通过不同的方法,同样可以往显示器上输出数据,就拿printffprintf来说,fprintf相较于printf只多了一个参数stdin,但是它们最后执行的结果都是一样的,那么这个stdin就值得我们去研究

stdin&stdout&stderr

  在C语言中,程序会默认打开三个流,分别是stdin(标准输入),stdout(标准输出)和stderr(标准错误),我们可以通过man手册来查阅这三个东西究竟是什么
在这里插入图片描述
  不难看出,这三个东西都是类型为FILE*的结构体指针,同时也是fopen的返回值类型,也就是文件指针,关于这个结构体里究竟有什么,接下来再慢慢分析

系统文件IO

  操作文件,除了C接口之外(当然其他的编程语言也有对应的文件操作),我们还可以使用系统调用接口来进行文件访问
  首先要认识到的一个系统调用接口就是open
在这里插入图片描述pathname:要打开或者创建的目标文件
flags:打开文件时,可以传入多个参数选项

参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
以上三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
O_TRUNC:若文件已存在,且打开文件是为了写,那么使用该选项就会将文件之前内容清空

  这些选项实质上类似于就是C语言中宏,所有的宏都是只有一个bit位上为1,其他bit位上为0,并且它们为1的bit位都是相互错位的
  这么说可能有些抽象,我在这里举个例子
在这里插入图片描述
在这里插入图片描述

  这里面的用#define定义的都是宏,当往Print中传参数的时候,通过按位或实现虽然只占用了已给参数的位置但是可以通过选项使执行的结构不同

返回值
成功:返回新打开的文件描述符
失败:返回-1(将错误码放到errno中)

mode:权限位(只有在需要创建文件时才会用到)
在这里插入图片描述
  这就是通过系统调用使用只读方式打开一个文件,并且使用系统调用close关闭文件,运行以上代码
在这里插入图片描述
  发现确实是在当前目录下创建了log,txt文件
  使用了以上系统调用,我们发现用以上open方式打开一个文件就和C语言的以只读方式打开文件非常的相似(系统调用的其他接口比如write、read、lseek等等都可以在C语言中找到类似的接口,这里就不再一一列举)

fopen=("log.txt","r");

  通过以上我们就可以大胆推测,C语言的文件操作有关的函数中是一定封装了系统调用接口。那么这个fd什么东西呢?不妨将这个fd打印以下看看
在这里插入图片描述
在这里插入图片描述  为了方便观察,可以一次性打开多个文件观察fd有什么特点
在这里插入图片描述
在这里插入图片描述
  我们发现打印的fd从3开始逐渐递增,这是要认识到fd到底有什么含义

open函数的返回值

  在认识返回值之前,先要明确两个概念:系统调用库函数。之前所提到的open和close就是系统提供的接口,我们称之为系统调用接口,而C语言的fwrite、fopen、fclose等等都是属于C标准库中的函数,我们称之为库函数
  当需要打开一个文件的时候,必定要先从磁盘中找到这个文件,然后将这个文件的文件内容和文件属性加载到内存当中。当我们向屏幕或者是其他地方打印字符串的时候,必定会需要访问硬件资源,比如我们使用到的printf函数向屏幕写入数据,显示器是硬件吗?答案是肯定的,所以你向显示器中写入数据本质上是向显示器这个硬件单元中写入数据;
  我们发现只要是发生了文件IO,不管是什么语言,最后一定是要和硬件产生关联。根据计算机系统的层状结构,最底层是各种硬件,然后是操作系统,接着是系统调用接口,最后才是用户层
  当一个C程序通过pritnf这样的库函数去访问硬件资源的时候,由于上面所述,C程序是不能直接去访问硬件资源的,它必须要通过操作系统来间接访问。因为操作系统是所有软硬件的管理者,它不允许应用层直接绕过操作系统去访问硬件,所以决定了在文件操作的时候,整个操作必须贯穿整个计算机体系的层状结构。
  站在操作系统的角度上,它必须提供一系列的系统调用为用户层服务(换句话说,操作系统要为我们提供一系列与文件相关的系统调用才有了C语言的一系列的文件操作)
  一句话总结:可以认为f#系列的函数,都是对系统调用的封装,方便二次开发

文件描述符fd

  通过之前的代码,我们可以知道,fd就是一个整数,但是不知道这个整数具体有什么含义

打开文件背后的操作

  当我们打开一个文件的时候,操作系统要在内存中创建相应的数据结构来描述,这个数据结构在linux中是一个结构体,叫做struct file,表示一个已经打开的文件对象(这个结构体对象中保存了文件相关的信息例如:inode、属性、方法集、权限等等,当然操作系统中会有多个文件被打开,自然内存中会有多个文件结构体,操作系统为了管理这些结构体,会将这些结构体用指针的方式连接起来,用链表的方式管理)
  在进程的task_struct当中存在一个类型为struct files*的结构体指针files,指向类型为struct files_struct的结构体,这个结构体中存在一个指针数组struct file* fd_array[],数组里面存的就是该进程所打开的文件所对应的文件对象,而文件描述符就是对应的数组下标
在这里插入图片描述

文件描述符的分配规则

  当我们直接打开一个文件
在这里插入图片描述
在这里插入图片描述

当我们关闭0或者2(这里以关闭0为例)
在这里插入图片描述
在这里插入图片描述
再次运行发现结果变为了0
文件描述符分配规则:在ffile_struct数组中,找到当前没有被使用的最小的下标,作为新的文件描述符

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

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

相关文章

tomcat启动闪退问题解决方法

文章目录 Tomcat启动闪退的常见问题及解决方法Tomcat是什么启动闪退的常见问题及解决方法1. 内存不足问题描述&#xff1a;案例分析&#xff1a;解决方法&#xff1a; 2. 端口冲突问题描述&#xff1a;解决方法&#xff1a; 3. 日志错误问题描述&#xff1a;解决方法&#xff1…

冰蓄冷系统基础知识

冰蓄冷是将水制成冰储存冷量&#xff0c;它是潜热蓄冷的一种方式。当压力保持不变时&#xff0c;物质在相变过程中保持恒定温度并吸收或释放热量&#xff0c;通常把这个温度称为相变温度(即溶解温度或凝固温度)&#xff0c;把吸收或释放的热量称相变潜热。在常压下&#xff0c;…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续使用 4、创建时间序列数据 5、划分数据集 6、定义LSTM网络 &#xff08;1&#xff09;创建顺序模…

一、初识VUE

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c…

MySQL常见问题解决和自动化安装脚本

常见问题 MySQL密码正确但无法登录的情况 这种情况一般都是因为缓存&#xff0c;使用mysql -u root -p123456直到成功登陆为止&#xff0c;并且进入之后重新修改密码&#xff0c;多次重复修改密码的命令并且再一次清除缓存后退出。 ALTER USER rootlocalhost IDENTIFIED WIT…

基于Unity+Vue通信交互的WebGL项目实践

unity-webgl 是无法直接向vue项目进行通信的&#xff0c;需要一个中间者 jslib 文件 jslib当作中间者&#xff0c;unity与它通信&#xff0c;前端也与它通信&#xff0c;在此基础上三者之间进行了通信对接 看过很多例子&#xff1a;介绍的都不是很详细&#xff0c;不如自己写&…

【MATLAB源码-第199期】基于MATLAB的深度学习(CNN)数字、模拟调制识别仿真,输出识别率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于深度学习的调制识别系统利用复杂的数学模型和算法来识别和分类从不同来源接收到的无线信号的调制类型。这种技术的应用广泛&#xff0c;特别是在无线通信、电子战、频谱监测和认知无线电等领域中具有重要价值。调制识别系…

算法导论 总结索引 | 第三部分 第十二章:二叉搜索树

1、搜索树数据结构 支持 许多动态集合操作&#xff0c;包括 SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT 和 DELETE 等。使用搜索树 既可以作为一个字典 又可以作为一个优先队列 2、二叉搜索树上的基本操作 所花费的时间 与这棵树的高度成正比。对于有n个结点的…

汽车热辐射、热传导、热对流模拟加速老化太阳光模拟器系统

汽车整车结构复杂&#xff0c;材料种类繁多&#xff0c;在使用过程中会面临各种严酷气候环境的考验&#xff0c;不可避免会出现零部件材料老化、腐蚀等不良现象&#xff0c;从而影响汽车的外观、功能&#xff0c;甚至产生安全隐患。因此&#xff0c;分析汽车零部件材料老化腐蚀…

深入剖析Tomcat(五) 剖析Servlet容器并实现一个简易Context与Wrapper容器

上一章介绍了Tomcat的默认连接器&#xff0c;后续程序都会使用默认连接器。前面有讲过Catalina容器的两大块内容就是连接器与Servlet容器。不同于第二章的自定义丐版Servlet容器&#xff0c;这一章就来探讨下Catalina中的真正的Servlet容器究竟长啥样。 四种容器 在Catalina中…

音视频入门基础:像素格式专题(1)——RGB简介

一、像素格式简介 像素格式&#xff08;pixel format&#xff09;指像素色彩按分量的大小和排列。这种格式以每个像素所使用的总位数以及用于存储像素色彩的红、绿、蓝和 alpha 分量的位数指定。在音视频领域&#xff0c;常用的像素格式包括RGB格式和YUV格式&#xff0c;本文…

【海博】雅思该怎么练?

文章目录 前言 备考计划 模拟考试 参考资料 前言 见《【海博】浅析海博深造》 见《【海博】雅思和托福该考哪个&#xff1f;》 见《【海博】雅思该怎么考&#xff1f;》 见《【海博】雅思考什么&#xff1f;》 备考计划 第一周确定你的目标考试分数。 做一套雅思模拟试题&…

npm install报错

总结&#xff1a;没有安装visual studio 2017以上带有C桌面开发的版本 #开始试错 #报错总信息mingw_x64_win版本 百度网盘链接: link 提取码&#xff1a;3uou #尝试用mingw配置个C编译器&#xff0c;并配置环境变量&#xff0c;失败 #只认可使用VS!GIthub原址: 链接: link 上…

python公务用车医院校园企业车辆管理系统

本 Python版本&#xff1a;python3.7 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask都有,都支持 后端&#xff1a;python 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 公务用车管理智慧云服务监管平台有管理员和用户…

java中的字节流和File类

目录 正文&#xff1a; 1.File类 1.1概述 1.2常用方法 2.FileInputStream 2.1概述 2.2常用方法 3.FileOutputStream 3.1概述 3.2常用方法 总结&#xff1a; 正文&#xff1a; 1.File类 1.1概述 File类是Java中用来表示文件或目录的类&#xff0c;它提供了一系列方…

【项目学习01_2024.05.02_Day04】

学习笔记 4 课程分类查询4.1需求分析4.2 接口定义4.3 接口开发4.3.1 树型表查询4.3.2 开发Mapper 4 课程分类查询 4.1需求分析 有课程分类的需求 course_category课程分类表的结构 这张表是一个树型结构&#xff0c;通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…

Sass语法---sass的安装和引用

什么是Sass Sass&#xff08;英文全称&#xff1a;Syntactically Awesome Stylesheets&#xff09; Sass 是一个 CSS 预处理器。 Sass 是 CSS 扩展语言&#xff0c;可以帮助我们减少 CSS 重复的代码&#xff0c;节省开发时间。 Sass 完全兼容所有版本的 CSS。 Sass 扩展了…

centos7安装真的Redmine-5.1.2+ruby-3.0.0

下载redmine-5.1.2.tar.gz&#xff0c;上传到/usr/local/目录下 cd /usr/local/ tar -zxf redmine-5.1.2.tar.gz cd redmine-5.1.2 cp config/database.yml.example config/database.yml 配置数据连接 #编辑配置文件 vi config/database.yml #修改后的内容如下 product…

【介绍下Apache的安装与目录结构】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Vitis HLS 学习笔记--MAXI手动控制突发传输

目录 1. 简介 2. MAXI 突发传输详解 2.1 突发传输的前置条件 2.2 hls::burst_maxi 详解 2.2.1 基本知识 2.2.2 hls::burst_maxi 构造函数 2.2.3 hls::burst_maxi 读取方法 2.2.4 hls::burst_maxi 写入方法 2.3 示例一 2.4 示例二 3. 总结 1. 简介 这篇文章探讨了在…