【linux】初步认识文件系统

news2024/11/27 8:37:22

初步认识文件系统

  • 前置知识的简单了解
  • 简单回顾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.coloradmin.cn/o/1650625.html

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

相关文章

【Hugging Face】编写 shell 脚本在 huggingface 镜像站快速下载模型文件

前言 我们使用 Git LFS 和 wget 结合的方法&#xff0c;小文件使用 Git 下载&#xff0c;大文件使用 wget 下载 Git 下载的优缺点&#xff1a; 优点&#xff1a;相当简单 缺点&#xff1a;不支持断点续传 直接 wegt 下载比较稳定&#xff0c;但是欠缺优雅 我们可以将这两…

城市二手房数据分析与房价预测

实现功能 数据分析 二手房价格-时间分析 二手房数量-时间分析 二手房分布-区域分析 二手房户型分析 二手房朝向分析 二手房价格-区域分析 二手房热词词云 房价预测 采用合适的算法模型&#xff0c;对模型进行评估。通过输入影响因素输出预测价格。 采用技术与框架 M…

暗区突围服务器连接失败/网络异常/无法连接下载解决方法

暗区突围是一款仿真战场的模拟&#xff0c;首要介绍的自然是游戏中基本都会参与的模式&#xff0c;叫做战术行动&#xff0c;大家参与其中是会作为特遣队员的身份来做任务&#xff0c;面临的是一个全面自给自足的战场环境&#xff0c;这种模式要求玩家在进入暗区之前自行筹备所…

Springboot+Vue项目-基于Java+MySQL的影院订票系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

uni-app+vue3 +uni.connectSocket 使用websocket

前言 最近在uni-appvue3websocket实现聊天功能&#xff0c;在使用websocket还是遇到很多问题 这次因为是app手机应用&#xff0c;就没有使用websocket对象&#xff0c;使用的是uni-app的uni.connectSocket 为了方便测试这次用的是node.js一个简单的dom&#xff0c;来联调模拟…

网络基础——路由

网络基础——路由 要想网络畅通&#xff0c;应让网络中的路由器知道如何转发数据包到各个网段。路由器根据路由表来转发数据包&#xff0c;而路由表是通过直连网络、静态路由以及动态路由来构建的。 route命令&#xff0c;底层是使用ioctl实现&#xff1b;ip命令&#xff0c;…

洛谷 P3391:文艺平衡树 ← Splay树模板题

【题目来源】https://www.luogu.com.cn/problem/P3391【题目描述】 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间…

大模型爱好者的福音,有了它个人电脑也可以运行大模型了

GPT4ALL是一款可以运行在个人电脑上的大模型系统&#xff0c;不需要GPU即可运行&#xff0c;目前支持mac&#xff0c;linux和windows系统。 什么是GPT4ALL&#xff1f; 不论学习任何东西&#xff0c;首先要明白它是个什么东西。 Open-source large language models that run …

【C 数据结构-图】2. 图的存储结构

文章目录 【 1. 图的顺序存储结构 】1.1 基本原理1.2 顺序存储结构的 C 实现 【 2. 图的链式存储结构 】2.1 图的临接表存储结构2.1.1 临接表的 基本原理2.1.2 临接表的 链表节点2.1.3 邻接表 各结构体的C实现2.1.4 临接表 计算顶点的出度和入度邻接表计算 无向图的出度和入度邻…

IT项目管理【太原理工大学】前置知识点精简总结

根据上次考试以及其他方向考试的经验&#xff0c;这届考试可能偏向出题更灵活&#xff0c;能死记硬背或套公式的题减少&#xff0c;多做准备呀各位大三苦逼人&#xff0c;挂了补考还得回来补考凸^-^凸共勉 &#xff08;另外&#xff0c;别作弊&#xff0c;今天人工智能考试逮住…

mib browser读取mib文件的oid(飞塔防火墙为例)

在配置zabbix监控的时候,配置监控项最为麻烦,一般我们都会套用模板,这种方式比较简单,但是有些设备就是没有现成的zabbix模板,怎么办? 今天我们使用MIB Browser来获取设备SNMP的OID,然后加入zabbix 。 1.什么是MIB Browser SNMP客户端工具MIB Browser, 全名iReasonin…

牛客网刷题 | BC78 KiKi说祝福语

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 2020年来到了&#…

synchronized与volatile关键字

1.synchronized的特性 1.1互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到 同一个对象 synchronized 就会阻塞等待. 进入 synchronized 修饰的代码块, 相当于 加锁 退出 synchronized 修饰的代码块, 相当于 解锁 syn…

【Linux网络】PXE批量网络装机

目录 一、系统装机 1.1 三种引导方式 1.2 系统安装过程 1.3 四大重要文件 二、PXE 2.1 PXE实现原理 2.2 PXE手动搭建过程 2.3 kickstart配合pxe完成批量自动安装 一、系统装机 1.1 三种引导方式 硬盘光驱(U盘)网络启动 1.2 系统安装过程 加载boot loader加载启动安…

国内SaaS遇冷?未来企业服务赛道是否还有机会?

引言 SaaS 自诞生起&#xff0c;在国内的发展便始终是危与机并存的&#xff0c;虽然使用 SaaS 的企业在逐渐增多&#xff0c;但唱衰 SaaS 的声音也始终不绝于耳。企业付费意愿低&#xff0c;使用产品并不能带来直接的营收提升。SaaS 产品面临着多种不同问题。 在企业对软件付费…

静电纺丝壳聚糖纳米纤维膜

静电纺丝壳聚糖纳米纤维膜是通过静电纺丝技术制备的一种由壳聚糖纳米纤维组成的薄膜材料。静电纺丝技术是一种有效的制备微纳米纤维的方法&#xff0c;可以将高分子溶液或熔体在静电场作用下喷射成纤维状物质&#xff0c;进而形成纳米纤维膜。 壳聚糖是一种天然高分子多糖&…

程序员的实用神器:助力软件开发的利器 ️

程序员的实用神器&#xff1a;助力软件开发的利器 &#x1f6e0;️ 程序员的实用神器&#xff1a;助力软件开发的利器 &#x1f6e0;️引言摘要自动化测试工具&#xff1a;保障代码质量的利剑 &#x1f5e1;️编写高效测试用例 持续集成/持续部署工具&#xff1a;加速交付的利器…

Linux命名管道的创建及应用

目录 一、命名管道的定义即功能 1.1创建命名管道 1.2匿名管道和命名管道的区别 1.3命名管道的打开规则 1.4系统调用unlink 二、进程间命名管道的创建及使用 2.1Comm.hhp 2.2PipeServer.cc 2.3PipeClient.cc 一、命名管道的定义即功能 管道应用的一个限制就是只能在具有…

[XR806开发板试用] XR806 调用cjson 实现数据序列化

很荣幸获得极术设区提供的这次试用机会&#xff0c;可以接触鸿蒙操作系统。我工作接触最多的是linux 平台的嵌入式ARM平台较多&#xff0c;这次跑了下鸿蒙&#xff0c;也非常有趣。 不过接进年底了&#xff0c;日常大小琐碎事情突然多了起来&#xff0c;测评的比较匆忙&#x…

Java的Fork-Join简单介绍

Java的Fork-Join框架是Java 7引入的一个用于并行处理的轻量级框架&#xff0c;它基于分治策略&#xff08;Divide and Conquer&#xff09;&#xff0c;特别适合于那些可以被分解为多个子任务的任务。Fork-Join框架的核心思想是将一个大任务&#xff08;Task&#xff09;拆分成…