【Linux】认识文件(一):文件标识符

【Linux】认识文件(一):文件标识符

  • 一.什么是文件?
    • 1.文件的本质
    • 2.文件的分类
  • 二.访问文件操作
    • 1.C语言中的访问文件接口
      • i.fopen
      • ii.fclose
      • iii.fwrite
    • 2.系统访问文件接口
      • i.open
      • ii.close
      • iii.write
  • 三.文件管理
    • 1.对所有打开文件的管理
    • 2.进程对自己打开的文件的管理
      • 文件标识符【FD】

本人摸了快四个月的鱼,最近终于开始重新学习了,最近学习了文件的部分内容。

一.什么是文件?

1.文件的本质

用了计算机这么多年,文件应该算是再熟悉不过了

通俗的讲文件就是就是用来存储的

那文件是由什么组成的?
文件=文件内容+文件属性

由这个组成其实我们就能知道文件的本质其实就是数据
内容和属性本质都是用数据存储的。

2.文件的分类

这里我们可以将文件分成两类:打开的文件 和 未打开的文件

可能有人好奇,为什么这个也能成为分类的依据

这里用两个问题来解决大家的疑惑:
1.文件是谁进行打开的?
2.没打开的文件存储在哪里?

第一个问题
大伙可能会回答文件是由系统打开的
确实没错,但是范围太广了
就好像问:学生是谁教的,回答是学校
范围太广了,准确来说是老师教的。

所以文件由系统打开,这个答案过于广,准确来说其实是进程来打开的。

那么进程是在哪里进行运行的?
答案是内存

第二个问题
很简单,答案就是存储器中,就当它是在硬盘中吧。

所以说靠打开的文件和未打开的文件进行分类
其实就是分成了内存中的文件和硬盘中的文件

针对两个类型的文件 ,这里也能探究不同的问题

1.打开的文件->进程 :研究进程和文件的关系
2.没打开的文件->磁盘:如何将文件放置好,如何快速进行增删查改,所以本质考虑的是存储

这次主要探究的是:对进程中的文件的操作和管理

二.访问文件操作

这次也不是重点讲文件操作的
所以不会讲的太过于细致 这里就带大家使用几个接口,让大伙见见猪跑就行了。

1.C语言中的访问文件接口

i.fopen

如果想在C语言中进行文件操作
通常的第一步是使用fopen函数打开对应文件
在这里插入图片描述
fopen函数用于:
在指定的文件路径上打开文件,并返回一个指向FILE结构的指针
这里要注意:FILE 是C语言中自己封装的结构体,和系统无关

以便后续对文件进行读取或写入操作。

第一个参数 filename就是文件名
第二个参数则是文件的打开方式

文件打开的方式不同,代表的是给进程的文件的操作方式不同
“r”:以只读方式打开文件。

“w”:以写入方式打开文件。如果文件不存在,则创建新文件。如果文件已存在,则截断文件内容为零。

“a”:以追加方式打开文件。如果文件不存在,则创建新文件。如果文件已存在,则将写入的数据追加到文件末尾。

ii.fclose

在这里插入图片描述

fclose其实就是和fopen对应的
fclose会将打开的文件进行关闭
关闭的过程
1.将缓冲区中没有给的数据传给文件
【这里的缓冲区在之后的博客的中会详细讲解】
2.释放文件相关的资源:关闭文件后,fclose函数会释放与文件相关的内存和其他资源。
3.最后返回整数,回报用户是否关闭成功。

iii.fwrite

在这里插入图片描述

  • ptr:指向要写入的数据块的指针。
  • size:每个数据项的大小(以字节为单位)。
  • count:要写入的数据项的数量。
  • stream:指向要写入的文件的指针。

使用
在这里插入图片描述
运行前:
在这里插入图片描述
运行后:
在这里插入图片描述
这里我们就能看到,运行代码后
创建了原本不存在的test.log
并且输入了对应的文字

注意小点:
fwrite时,strlen不需要+1
在这里插入图片描述

因为字符串以\0结尾时C语言的规定,不是文件中的文本规定
所以写入时,不需要将\0进行写入

2.系统访问文件接口

文件在磁盘上,磁盘时外部设备,访问磁盘文件其实就是访问硬件
我们要把这个给理解了

所以按照我们以前的知识(以前博客写的)
因为系统不相信普通用户
用户在调用硬件的时候,必须经过操作系统来调用硬件
所以几乎所有的库,只要是访问硬件设备,都要对调用函数进行封装

所以fprintf,fwrite,fclose都是经过系统接口的封装得来的C接口

所以不管其他语言的文件操作有多么不同,封装的系统接口都是一样的,万变不离其宗

这里我们就挑几个系统访问硬件的接口来见见猪跑

i.open

在这里插入图片描述
注意:
在谈各个参数之前首先注意一下它的返回值:
相比于fopen返回的FILE
这里返回的是一个整数
其实这个整数就是文件标识符【FD】
这个在下面会详细解释,现在只要知道这个整数是文件标识符就行。

参数列表:

  • path:要打开或创建的文件路径。
  • flags:表示文件打开的标志和选项,可以使用多个标志进行位运算组合
  • 常见的标志有:
    O_RDONLY:只读方式打开文件。
    O_WRONLY:只写方式打开文件。
    O_RDWR:读写方式打开文件。
    O_CREAT:如果文件不存在,则创建文件。
    O_TRUNC:如果文件存在,将其截断为空文件。
    O_APPEND:在文件末尾追加数据。

    等等,还有其他可用的标志,请参考相关文档以获取更多信息。
  • mode:新创建文件的权限,仅在使用 O_CREAT 标志时有效。它指定了文件的访问权限,通常使用八进制表示,例如 0644【文件执行权限】。

ii.close

在这里插入图片描述
同样是和open进行对应的

其中,fd 是要关闭的文件描述符。
返回一个整数值来表示操作的结果。如果成功关闭文件,返回值为 0;
如果发生错误,返回值为 -1

iii.write

在这里插入图片描述
其中,各个参数的含义如下:

  • fd:要写入的文件描述符。
  • buf:指向要写入数据的缓冲区的指针。
  • count:要写入的字节数。

ssize_t是返回的一个非负数值,表示实际写入的字节数。
如果返回的值与 count 不同,表示写入过程中可能发生了错误
如果发生错误,可以使用 perror 函数输出错误信息。

使用:
在这里插入图片描述

结果:

在这里插入图片描述

三.文件管理

接下来就是这个博客的核心了。

那么打开的文件在系统中是如何被管理的呢?

我们知道
打开文件会被加载到内存中
操作系统内部一定存在大量被打开的文件
所以系统需要对所有打开的文件进行管理

同时:
不光是这个管理
我们要知道,一个进程能打开多个文件
单个进程打开的文件也要进行管理

这边我们就分开来讨论

1.对所有打开文件的管理

首先是对系统打开的所有文件进行管理

这个和以前分析管理进程的结构的步骤一样。

对文件先描述在组织
在这里插入图片描述
大致其实就这样的链表结构
将对文件的管理转换到对链接的管理

2.进程对自己打开的文件的管理

接下来是对单个进程打开的文件进行管理
在这里插入图片描述

文件标识符【FD】

现在应该知道文件标识符是什么了吧。

在这里插入图片描述

文件标识符其实就是这个管理进程打开的文件的数组的下标

所以open返回的整数其实就是这个下标而已。
并没有想象中的那么高大上,单纯只是个数组下标而已

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

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

相关文章

FlinkCDC基础篇章2-数据源 SqlServerCDC写入到ES中

接着 上期FlinkCDC基础篇章1-安装使用 下载 Flink 和所需要的依赖包 # 下载 Flink 1.17.0 并将其解压至目录 flink-1.17.0 下载下面列出的依赖包,并将它们放到目录 flink-1.17.0/lib/ 下: 下载链接只对已发布的版本有效, SNAPSHOT 版本需要本地编译 …

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序:1. 寻找最后一个节点的父亲,依次向上遍历,完成小堆的建立;2. 从最后一个元素开始,和堆顶的数据做交换,此时最小的数据在对后面,然后对剩下的…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言,这使我们只要生成一个可执行程序即…

【React】Sigma.js框架网络图-入门篇

一、介绍 Sigma.js是一个专门用于图形绘制的JavaScript库。 它使在Web页面上发布网络变得容易,并允许开发人员将网络探索集成到丰富的Web应用程序中。 Sigma.js提供了许多内置功能,例如Canvas和WebGL渲染器或鼠标和触摸支持,以使用户在网页上…

Echarts-丝带图

Echarts-丝带图 demo地址 打开CodePen 什么是丝带图? 丝带图是Power BI中独有额可视化视觉对象,它的工具提示能展示指标当期与下期的数据以及排名。需求:使用丝带图展示"2022年点播订单表"不同月份不同点播套餐对应订单数据。 …

搭建HBase2.x完全分布式集群(CentOS 9 + Hadoop3.x)

Apache HBase™是一个分布式、可扩展、大数据存储的Hadoop数据库。 当我们需要对大数据进行随机、实时的读/写访问时,可以使用HBase。这个项目的目标是在通用硬件集群上托管非常大的表——数十亿行X数百万列。Apache HBase是一个开源、分布式、版本化的非关系数据库…

Ceph学习 -11.块存储RBD接口

文章目录 RBD接口1.基础知识1.1 基础知识1.2 简单实践1.3 小结 2.镜像管理2.1 基础知识2.2 简单实践2.3 小结 3.镜像实践3.1 基础知识3.2 简单实践3.3 小结 4.容量管理4.1 基础知识4.2 简单实践4.3 小结 5.快照管理5.1 基础知识5.2 简单实践5.3 小结 6.快照分层6.1 基础知识6.2…

微信小程序使用 Vant Weapp 中 Collapse 折叠面板 的问题!

需求:结合Tab 标签页 和 Collapse 折叠面板 组合成显示课本和章节内容,并且用户体验要好点! 如下图展示: 问题:如何使用Collapse 折叠面板 将内容循环展示出来? js中的数据是这样的 代码实现&#xff1…

Python | Leetcode Python题解之第39题组合总和

题目&#xff1a; 题解&#xff1a; from typing import Listclass Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def dfs(candidates, begin, size, path, res, target):if target < 0:returnif target 0:res.append(p…

Stability AI 发布 SD3 API:开启人工智能新篇章

文章目录 1.Stable Diffusion 3 API开放了! 2.Stability AI Document地址3.获取API Key4.API方式调用SD3出图接口地址接口请求规范接口请求响应结果 5.Stable Diffusion 3.0、Stable Image Core、Fooocus 2.3.1、MidJounery效果查看 1.Stable Diffusion 3 API开放了! Stabilit…

react 响应式栅格布局

遇到一个小问题 , 有很多的下拉框放在了一行的盒子里 用到了栅格思路 , 但响应式处理屏幕时候右侧的按钮会覆盖掉样式 之前我的思路是子绝父相 , 将按钮定在最右侧 , 按钮和下拉框都在同一盒子中 , 且做了栅格处理没想到还是会覆盖解决 : 后来我用到了 margin-left: auto 来让…

蓝桥杯2024年第十五届省赛真题-宝石组合

思路&#xff1a;参考博客&#xff0c;对Ha,Hb,Hc分别进行质因数分解会发现&#xff0c;S其实就等于Ha&#xff0c;Hb&#xff0c;Hc的最大公约数&#xff0c;不严谨推导过程如下&#xff08;字丑勿喷&#xff09;&#xff1a; 找到此规律后&#xff0c;也不能枚举Ha&#xff…

OpenCV——Niblack局部阈值二值化方法

目录 一、Niblack算法1、算法概述2、参考文献二、代码实现三、结果展示OpenCV——Niblack局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Niblack算法 1、算法概述 Niblack 算法是一种典型的局部阈值…

JavaWeb开发05-事务管理-AOP概述-AOP通知类型-通知顺序-切入点表达式-连接点-案例

一、事务管理 1.事务回顾 2.Spring事务管理 删除部门和删除部门下的员工应该绑定在一起&#xff0c;但是如果这两个操作之间出现错误&#xff0c;就会执行删除部门不删除员工&#xff0c;所以需要使用事务将两个任务绑定在一起&#xff0c;要么一起成功要么一起失败 Spring中如…

基础知识集合

https://blog.csdn.net/sheng_q/category_10901984.html?spm1001.2014.3001.5482 epoll 事件驱动的I/O模型&#xff0c;同时处理大量的文件描述符 内核与用户空间共享一个事件表&#xff1a;监控的文件描述符以它们的状态&#xff0c;当状态变化&#xff0c;内核将事件通知给…

Mac上Maven的安装和环境变量配置保姆级教程(最新版实时更新)

目录 一、Maven的安装 1.进入官网&#xff08;Maven官网&#xff09;下载安装包并解压 2.这里我使用了Homebrew安装Maven 安装Homebrew&#xff1a; 安装Maven&#xff1a; 二、Maven配置环境变量 1.打开环境变量文档&#xff1a; 2.在弹出文档结尾加入配置&#xff1a…

【Node.js】 fs模块全解析

&#x1f525;【Node.js】 fs模块全解析 &#x1f4e2; 引言 在Node.js开发中&#xff0c;fs模块犹如一把万能钥匙&#xff0c;解锁着整个文件系统的操作。从读取文件、写入文件、检查状态到目录管理&#xff0c;无所不能。接下来&#xff0c;我们将逐一揭开fs模块中最常用的那…

【HC32L110】华大低功耗单片机启动文件详解

本文主要记录华大低功耗单片机 HC32L110 的 汇编启动过程&#xff0c;包括startup_hc32l110启动文件详细注释 目录 1.启动文件的作用2.堆栈定义2.1 栈2.2堆 3.向量表4.复位程序5.中断服务程序6.堆栈初始化启动过程详解7.1从0地址开始7.2在Reset_Handler中干了啥&#xff1f; 8.…

PyTorch|保存及加载模型、nn.Sequential、ModuleList和ModuleDict

系列文章目录 PyTorch|Dataset与DataLoader使用、构建自定义数据集 PyTorch|搭建分类网络实例、nn.Module源码学习 pytorch|autograd使用、训练模型 文章目录 系列文章目录一、保存及加载模型&#xff08;一&#xff09;保存及加载模型的权重&#xff08;二&#xff09;保存及…

探究欧拉恒等式的美学与数学威力

正如老子所述&#xff0c;“道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物”&#xff0c;数学作为人类认知自然法则的语言&#xff0c;其数系的不断发展象征着对世界理解的深化。从自然数经由分数、无理数至复数&#xff0c;复数虽看似反直觉&#xff0c;却…