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

news2024/11/19 12:33:09

【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.coloradmin.cn/o/1610143.html

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

相关文章

ubuntu22.04搭建dns内网

近期,需要在无网络的ubuntu环境下搭建内部可用的dns内网,总共花费3个工作日晚上,总算成功搭建,做个记录,记录踩坑记录,同时方便以后翻阅。 安装软件包: 有网络环境下,比较简单&…

PostgreSQL中的索引类型有哪些,以及何时应选择不同类型的索引?

文章目录 索引 解决方案和示例代码 PostgreSQL提供了多种索引类型,每种类型都有其特定的应用场景和优势。选择合适的索引类型可以显著提高查询性能,减少数据库负载。 索引 以下是PostgreSQL中常见的索引类型及其适用场景: 1. B-tree 索引 …

【Linux 开发第一篇】如何在安装中完成自定义配置分区

安装配置自定义配置分区 在安装Centos的过程中,我们可以在安装位置部分手动配置分区 选择我要配置分区,点击完成: 我们自动分区分为三个分区:boot分区(引导分区),swap(交换分区&…

互联网技术知识点总览——操作系统知识点框架图

简介 本文对操作系统的知识点整体框架进行梳理和分享如下:

KaiwuDB CTO 魏可伟:AIoT,用行业定义数据库

4月12日,由中国 DBA 联盟(ACDU)与墨天轮社区联合主办的第十三届数据技术嘉年华(DTC 2024)于北京盛大召开。KaiwuDB CTO 魏可伟受邀发表《智创当下,KaiwuDB 从多模到 AI 的探索实践》主题演讲,向…

Go之map详解

map的结构 map实现的两个关键数据结构 hmap 定义了map的结构bmap 定义了hmap.buckets中每个bucket的结构 // A header for a Go map. type hmap struct {count int // 元素的个数flags uint8 // 状态标记,标记map当前状态,是否正在写入B …

VASP结合vaspkit+ShengBTE计算热电优值(二)

前文链接:VASP结合vaspkitShengBTE计算热电优值(一) 1、将前述计算得到的二阶力常数矩阵,三阶力常数矩阵文件分别命名为FORCE_CONSTANTS_2RD,FORCE_CONSTANTS_3RD。放于同一目录中。 编写CONTROL文件,其中…

借助 NVivo 彻底改变业务创新

在收集定性数据时,通常很难确定信息的情感底蕴。尤其是在金融行业,当涉及到经济金融状况和股票走势等问题时,通过文章、社交媒体和其他消费者平台了解市场的真实整体感受至关重要。这就是对数据应用情绪分析可以提供帮助的地方。 在德勤 针对…

追溯历史:SIEM 中的生成式人工智能革命

作者:来自 Elastic Mike Nichols, Mike Paquette 网络安全领域仿佛是现实世界的一个映射,安全运营中心(security operation center - SOC)就像是你的数字警察局。网络安全分析师就像是警察,他们的工作是阻止网络犯罪分…

【webrtc】m114自己实现的PrioritizedPacketQueue及优先级处理

G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\pacing\prioritized_packet_queue.h跟m98不同 :webrtc】m98 RoundRobinPacketQueue的优先级处理,m114直接使用taskqueue顺序处理了。甚至自己实现了优先级队列感觉简化了实现,更为清晰 易读,但是去掉了码率低就优先的逻辑。1…

Linux程序的地址空间,进程终止

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 一.程序的地址空间 1.1程序的地址空间的引入 我们知道frok可以创建…

R语言入门:“Hellinger“转化和“normalize“转化(弦转化)的公式表示与R代码实现

1、写在前面 vegan包中的decostand()函数为群落生态学研究提供了一些流行的(和有效的)标准化方法。有关decostand()函数标准化的一些标准化方法可以看我的另一篇笔记:R语言入门:vegan包使用decostand()函数标准化方法 由于在网络上没有找到关于这两个转…

AI 语音机器人系统怎么搭建

搭建AI语音机器人系统通常包括以下几个关键步骤: 确定需求和技术选型:首先要明确AI语音机器人需要实现的功能,选择合适的技术框架和工具,如自然语言处理工具、语音识别工具等。 搜集和准备数据:收集和整理与业务相关…

2.Python实战小项目—用Python批量压缩图片

2.Python实战小项目—用Python批量压缩图片 一摘要二个人简介三原理四流程五实战演示 一摘要 在Python中,批量压缩图片是一项相对直接且实用的任务,尤其适合需要处理大量图像数据的场合。Pillow库提供了一种简便的方式来达成这个目标,其强大的…

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统? Customer Relationship Management,简称CRM,指客户关系管理,是企业利用信息互联网技术,协调企业、顾客和服务上的交互,提升管理服务。为了企业信息安全以及使用方便,企业…

我为什么想成为一名程序员

#为什么你选择成为一名程序员# 目录 原因: 后续选择: 结尾: 原因: 本人是一个00后,出生在农村当时经济相对来说比较落后,村里面基本上都没几个人有手机。当时有些小伙伴他们拿着自己大人的手机在那里玩…

Youtube DNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 (1)规模。很多现有的推荐算法在小规模上效果好,但Youtobe规模很大。 (2)新颖度。Youtobe语料库是动态的,每秒都会有…

Java中的栈和队列

1.前言 在计算机科学中,数据结构是用来组织和存储数据的方式,以便可以高效地访问和修改。栈和队列是两种最基本的数据结构,它们在各种计算过程中都有广泛的应用。本文将介绍栈和队列的概念、特性以及它们的一些常见应用。 2.栈 2.1概念 栈…

姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。

春日已至,姑苏古城迎来了一场编程的盛宴——开放原子开源大赛OpenTiny前端Web应用开发挑战赛。历时三个月的激烈角逐,OpenTiny与众多开发者携手共赴这场智慧的较量。决赛路演于4月14日在苏州(太湖)产业软件园圆满落下帷幕~ 开放原…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统

目录 前言 准备工作 下载linux源码进行编译 linux源码下载 网站 问题 解决办法 编译 可能会遇到的问题 chroot下载debian环境 进入虚拟环境 把chroot的根目录文件打包为.gz文件 编译init文件(用于系统启动时的一系列引导) 给予文件夹权限 …