【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返回的整数其实就是这个下标而已。
并没有想象中的那么高大上,单纯只是个数组下标而已

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux入门学习 之 基础操作指令讲解(小白必看)

股票的规律找到了,不是涨就是跌 一、Linux下基本指令 1.ls 指令 2.pwd 命令 3.cd 指令 4.touch 指令 5.mkdir 指令 6.rmdir指令 && rm 指令 7.man 指令 8.cp 指令 9.mv指令 10.cat 11.more 指令 12.less 指令 13.head 指令 14.tail 指令 15…

SQLite作为应用程序文件格式(二十八)

返回:SQLite—系列文章目录 上一篇:SQLite数据库中JSON 函数和运算符(二十七) 下一篇:SQLite—系列文章目录 摘要 具有定义架构的 SQLite 数据库文件 通常是一种出色的应用程序文件格式。 以下是十几个原因: 简化的应用程序开发单文…

BUUCTF-MISC01金胖

题目:动图使用Stegsolve软件进行逐帧查看 下载文件后,图片隐写之gif多帧隐藏,这类题比较简单,只需要将图片使用Stegsolve软件进行逐帧查看就行了.file-open打开添加文件 将文件添加进来,而后点击Analyse-Frame Browse…

windows和linux服务器等保测评加固方法

服务器加固是通过各种方法增强服务器安全性的过程。保护操作系统免受黑客、破解者和攻击者的侵害。网络安全防护的目标是保密性、完整性、可用性、可控制性、不可否认性。 一、window服务器等保加固 以win2012和win2008 为例: (win2008) …

畅游网络:构建C++网络爬虫的指南

概述 随着信息时代的来临,网络爬虫技术成为数据采集和网络分析的重要工具。本文旨在探讨如何运用C语言及其强大的cpprestsdk库构建一个高效的网络爬虫,以便捕捉知乎等热点信息。为了应对IP限制的挑战,我们将引入亿牛云爬虫代理服务&#xff…

Spring 事务失效总结

前言 在使用spring过程中事务是被经常用的,如果不小心或者认识不做,事务可能会失效。下面列举几条 业务代码没有被Spring 容器管理 看下面图片类没有Componet 或者Service 注解。 方法不是public的 Transactional 注解只能用户public上&#xff0c…

使用Python+opencv实现自动扫雷

大家好,相信许多人很早就知道有扫雷这么一款经典的游戏,更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的…

吴恩达机器学习笔记 三十五 异常检测与监督学习

什么时候选择异常检测? 正样本 ( y 1 ) 的数量非常少 负样本 ( y 0 ) 的数量非常多 有很多不同的异常,现有的算法不能从正样本中得知什么是异常,或未来可能出现完全没见过的异常情况。 例如金融欺诈,隔几个月或几年就有新的…

OpenHarmony实战开发-搜索功能实现案例、如何使用includes方法对数据实现模糊查询

介绍 本示例介绍使用includes方法对数据实现模糊查询 效果图预览 使用说明 点击首页搜索框跳转到搜索页面在搜索页面输入框中输入搜索的内容,下方列表自动根据搜索的内容进行筛选渲染点击筛选后的列表跳转到相应的页面跳转后会保存搜索历史,搜索历史使…

深度解析 Spring 源码:三级缓存机制探究

文章目录 一、 三级缓存的概述二、 三级缓存的实现原理2.1 创建Bean流程图2.2 getBean()2.3 doGetBean()2.4 createBean()2.5 doCreateBean()2.4 getSingleton() 三、 三级缓存的使用场景与注意事项3.1 在实际开发中如何使用三级缓存3.2 三级缓存可能出现的问题及解决方法 一、…

特征值eigenvalue与特征向量eigenvector

特征值,特征向量概念 在线性代数中,对于一个给定的线性变换A,他的特征向量v经过这个线性变换的作用之后,得到的新向量仍然与原来的 v v v保持在同一条直线上。但长度或方向也许会改变。即: A v Av Av λ v \lambda…

Android开发——Fragment

Demo fragment_blank.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

Java Web3-2 - tomcat

https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Tomcat_架构解析.md https://zhuanlan.zhihu.com/p/40249834 早期&#xff0c;web技术主要用于浏览静态页面 时间发展&#xff0c;用户已经不满足于仅浏览静态页面。用户需要一些交互操作&#xff0c;获取…

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

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

【Web】DASCTF X GFCTF 2024|四月开启第一局 题解

目录 EasySignin cool_index web1234 web4打破防了&#x1f92e;&#xff0c;应该很接近解出来了&#xff0c;感兴趣的师傅续上吧 EasySignin 先随便注册个账号登录&#xff0c;然后拿bp抓包改密码(username改成admin) 然后admin / 1234567登录 康好康的图片功能可以打SS…

ros仿真启动小龟

1.启动RosMaster&#xff08;管理Ros中各个节点的“大管家”&#xff0c;每次启动Ros时需要首先启动RosMaster&#xff09; roscorefangfang-inspiron-5580:~/ros2/download/rosdistro$ roscore ... logging to /home/fang/.ros/log/6ec2d790-fe1d-11ee-aba8-1c1bb5cdec7c/ros…

MySQL-实验-单表、多表数据查询和嵌套查询

目录 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 &#xff08;2&#xff09;关键字子查询 1.多表查询 3.子查询 4.多表子查询 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 在右侧编辑器补充代码&#xff0c;查询大于所有平均年龄的员…

10 SQL进阶 -- 综合练习题 -- 10道经典SQL题目,配套数据与解答

1. 创建表结构和导入数据 1.1 新建数据库 1.2 执行建表语句 点击下方链接直接下载创建数据表脚本:http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/create_table.sql 执行建表语句执行成功查看创建的表1.3 导入数据 点击下方链接直接下载插入数据脚本:htt…

VBA脚本终章编译器崩溃

一、介绍 本篇文章为VBA脚本隐藏技术的最后一篇&#xff0c;将介绍如何在保证VBA脚本正常执行的情况下&#xff0c;使分析人员无法打开编译器。 那么为什么需要分析人员无法打开编译器呢&#xff1f; 首先&#xff0c;我们需要引入一个知识点。 在上篇《VBA隐藏技术stompin…