进程与文件

目录

Linux的 > 和 >>

文件的本质 :

 操作系统的系统调用函数

open:

close:关闭文件

write:

open的返回值:

 操作系统视角中的“文件与进程之间的关系”:

从上图可以得知以下论点:

什么是一切皆文件?

文件和进程关系图: 

 C语言的FIlE * 与 fd 的关系:


文件 = 属性 + 内容

Linux的 > 和 >>

在C语言中,使用 "W" 可以打开文件,如果没用需要打开的文件,那么则会创造一个文件,同时如果文件已经存在,且会被打开,同时如果文件内部有内容,那么文件的内容会被清空,这个功能和linux的 > 一致
而在C语言中,使用"a"打开文件,因为"a"是追加写,所以如果此文件不存在则会创建,如果文件已经存在,且有内容存在,那么则会在改内容的后面添加输入的数据内容,这个功能和Linux的>>一致

文件的本质 :

操作文件的本质是进程在操作文件,打开文件的本质实际上是进程在打开文件

访问文件可以使用系统调用来进行文件的访问 的 原因:

  • a.文件是存储在磁盘上的,而磁盘是外部设备,所以向文件中写入数据,实际上是向磁盘中写入数据,但是用户并没有直接向磁盘输入数据的权限,而是需要通过操作系统的调用,才能够在磁盘中写入数据。
  • b.因此,为了支持用户在磁盘中写入数据,操作系统会给用户提供相对应的系统调用。
  • c.所以像C语言中的打开文件的函数 fopen 或者写入文件的函数,都其实是操作系统调用的一种封装

 操作系统的系统调用函数

open:

open是打开文件的函数,open的第一个参数是需要打开的文件,注意如果需要打开的文件不在当前的路劲下,则要写全文件的路劲

open的第二个参数是文件的标识位,表示以某种方式打开文件,功能和C语言中的 "W"、"a"等等类似

如图所示,虽然使用open创建了一个文件,但是该文件的读写权限有一些问题,其实这和open的第三个参数有关系,open的第三个参数是对open创建的文件的权限进行动态调整

close:关闭文件

write:

虽然结果正确无误,但是终究还是会出现一些问题,这其实和open的标识符有关系,当使用O_WRONLY时,假设文件的内部已经具有了内容,随后我们用该标识符打开文件,并且使用了write进行数据的输入,那么我们输入的数据则会从头开始覆盖文件内部已有的数据

比如:我们在上面的已经具有文件内容的情况下,继续输入数据aaaaa则会得到以下的结果

若想要文件内容中只存在aaaa那么需要加上另一个标记位 O_TRUNC

该函数的功能和上文讲诉的 "W"和>一样,将文件的内容清空。

而诺不想要将文件的内容清空,而是想要在文件的内容之后继续添加数据则需要使用另一个标记位:O_APPEND

可以看出O_APPEND的功能和上文中的"a" 和>>一样! 

open的返回值:

open的返回值其实一种文件描述符,且一般使用open打开文件,得到的文件描述符是一个从3开始的整数

为什么是从3开始的呢?因为0、1、2其实是系统调用的标准输入、标准输出、标准错误

 操作系统视角中的“文件与进程之间的关系”:

从上图可以得知以下论点:

1.文件是在磁盘内部的,所以想要调用磁盘就必须通过操作系统,进行调用磁盘内部的文件,同时操作系统会对磁盘内部的文件进行管理

2.因为磁盘的内部可能会拥有成千上万个文件,这些文件有的会打开、有的会在读取,因此为了方便管理这些文件,操作系统会创建一共名为 struct file 的数据结构

3.关于struct file 这个数据结构,会分为两个部分,一个是文件内核级的缓存区域,一个是它的属性,因为文件 = 属性+内容,所以当文件打开后,会将自身的属性交给这个数据结构,而把内容交给缓存区域

4.每次打开一个文件,都会在操作系统内部创建一个struct file 结构体,当打开多个文件时,这些结构体就会相互双向链接,形成一个链表,而操作系统管理这个链表就相当于管理文件

5.因为进程需要对文件进行管理,同时在操作系统中也会存在多个进程,所以为了方便知道那些文件是那些进程打开的,操作系统在这里创建了一个指针数组 struct files_struct 

6.指针数组 struct files_struct 的内部存储着各个文件的地址,同时用数组内部的下标来进行标记,且该数组被进程内部的一个指针struct files_struct *files指针,这样就可以表明这个数组内部的所有文件都是该进程打开的。

7.指针数组的下标,在进程打开,后会被操作系统拿取,变成一个返回值,而这个返回值就是文件描述符,也就是系统调用函数中最重要的一个参数 fd 也是系统调用函数 open的返回值,因此struct files_struct 这个指针数组的下标 其实就是文件描述符!

8.对于文件的读,其实本质上就是一种拷贝,让操作系统在合适的调用了磁盘中的文件内容,将内容调用到了文件内核级的缓存区中,再由用户使用函数进行拷贝读取,而对于文件的写,就是在文件内核级的缓存区中更新内容随后在将新的内容冲刷回磁盘中

9.对于open函数,它的作用本质上是 :a.在进行struct file的创建、b.进行文件内核级缓冲区的开辟、c.调查进程的文件描述符,以此来进行文件的查找,d.将文件的地址填入struct files_struct中 e.返回struct files_struct的下标

什么是一切皆文件?

1.对于每一种外部设备,它们都具有读写方法,而在之前的学习中我们知道,操作系统是需要通过驱动来对底层的硬件进行管理的,所以每一种外部设备的读写方法都即存在它们相对应的驱动之中。

2.同时,每一个设备都会由操作系统创建一个数据结构 strcut file ,每次打开一个设备,操作系统就会开始创建一个strcut file

3.同时这个数据结构 struct file 的内部具有 一个函数指针数,这个函数指针指向 会 对应的 设备驱动上的 读写方法,所以如果要使用操作系统对外部设备进行调用和访问,只需要调用struct file 内部的指针即可。

 4.从上文可以看出 struct file 不仅仅是从磁盘中读取文件,还是可以读取设备上的数据,于是我们也可以得知在struct file的内部还有一个指向底层的指针表,里面寄存着指向外设的读写方法指针

文件和进程关系图: 

 C语言的FIlE * 与 fd 的关系:

 在上面的叙述中,我们可以知道系统调用文件的过程中,是只认 文件描述符 也就是 只认fd的!

那么为什么C语言可以使用FILE*进行打开文件等操作呢?

答案是C语言中的FILE*内部具有fd,换言之,就是FILE*是fd的封装接口,变成封装接口的原因是在写代码的过程中会因为操作系统的不一致而导致某些系统调用的功能不同,所以一般推荐用户使用语言提供的调用语言来写更为合适。


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

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

相关文章

平台介绍-搭建赛事运营平台(7)

平台采用分层授权策略。权限体系的核心还是角色模式。通过系统先定义角色,然后给用户绑定角色。一个用户可以拥有多个角色,是多个角色拥有权限的并集。角色除了拥有还有拒绝,拒绝拥有五常才有的一票否决权。 平台新建品牌时,新建用…

LabVIEW电动汽车直流充电桩监控系统

LabVIEW电动汽车直流充电桩监控系统 随着电动汽车的普及,充电桩的安全运行成为重要议题。通过集成传感器监测、单片机技术与LabVIEW开发平台,设计了一套电动汽车直流充电桩监控系统,能实时监测充电桩的温度、电压和电流,并进行数…

基于微信小程序的民宿短租系统设计与实现(论文+源码)_kaic

摘 要 随着社会的发展,出差、旅游成为常态,也就造成民宿短租市场的兴起。人们新到陌生的环境里找民宿一般都是通过中介。中介虽然可以快速找到合适的民宿但会收取大量的中介费用,这对刚到新环境里的人们来说是一笔大的资金支出。也有一些人通…

Unity TMP 使用教程

文章目录 1 导入资源包2 字体制作3 表情包制作4 TMP 控件4.1 属性4.2 富文本标签 1 导入资源包 “Window -> TextMeshPro -> Import TMP Essential Resources”,导入完成后会创建一个名为"TextMehs Pro"的文件夹,这里面包含所需要的资源…

标定系列——基于OpenCV实现普通相机、鱼眼相机不同标定板下的标定(五)

标定系列——基于OpenCV实现相机标定&#xff08;五&#xff09; 说明代码解析VID5.xmlin_VID5.xmlcamera_calibration.cpp 说明 该程序可以实现多种标定板的相机标定工作 代码解析 VID5.xml <?xml version"1.0"?><!-- 相机拍摄的标定板图像路径名 --…

每日一题 --- 反转字符串中的单词[力扣][Go]

反转字符串中的单词 题目&#xff1a;151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符…

Zabbix6 - Centos7源码编译部署HA高可用集群手册

Zabbix6 - Centos7源码编译部署HA高可用集群手册 HA高可用集群 总所周知,在我们IT运维的圈圈中,HA高可用集群服务算是逼格最高的吧也是运维里保障力度最大的环境。 HA是HighlyAvailable缩写,是双机集群系统简称,提高可用性集群,是保证业务连续性的有效解决方案,一般有两个…

GitHub开源项目权限管理-使用账号和个人令牌访问

1.打开后台账号设置 2.找到左下角的Developer settings 3.找到Personal access tokens 的 Tokens(classic) 4.选择创建新证书 5.填写证书信息 6.点击生成证书&#xff0c;复制证书并且保存起来&#xff08;血泪教训&#xff0c;证书只会在创建时显示一次&#xff0c;以后就再也…

用于 Linux 运维的专门发行版,以及工具

Linux 运维必备的13款实用工具 https://blog.csdn.net/m0_46426259/article/details/121681374 2023 适用于安全专业人士的十款 Linux 发行版 https://www.sysgeek.cn/linux-distributions-for-security/#google_vignette 6个用于黑客攻击的最佳Linux发行版 https://zhuan…

WebView的使用详解

WebView 现在Android开发基本都会用到WebView,所以自己准备系统的整理下,供自己学习之用. 1.简介 WebView是一个基于webkit引擎、展现web页面的控件。 Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 2.作用 显示和渲染…

Django安装及第一个项目

1、安装python C:\Users\leell>py --version Python 3.10.6 可以看出我的环境python的版本3.10.6&#xff0c;比较新 2、 Python 虚拟环境创建 2.1 官网教程 目前&#xff0c;有两种常用工具可用于创建 Python 虚拟环境&#xff1a; venv 在 Python 3.3 及更高版本中默…

安全的内网通讯软件,WorkPlus定制化 IM/办公门户解决方案

如今处于数字化转型的“加速期”&#xff0c;政企正经历着一场数字化迭代升级的时代浪潮。而不少企业都已具备了数字化管理的意识&#xff0c;数字化应用场景也在全面推开。WorkPlus不断推动信息技术与企业业务深度融合&#xff0c;作为安全的内网通讯软件&#xff0c;为企业提…

[RoarCTF 2019]Online Proxy --不会编程的崽

这几天也是ctf做得有点头疼了。好些序列化的题没碰&#xff0c;一直做些sql注入类的题目。闲来无事&#xff0c;在更一次sql注入吧。 整个页面就这点信息。首先想想为什么他能获取你的ip。猜测是数据包X-Forwarded-For。 它还输出上次访问页面客户端的ip。很明显了&#xff0c…

低功耗、低成本 NAS/公共文件夹 的可能性

使用现状&#xff1a;多台工作电脑&#xff0c;家里人手一台&#xff0c;还在两个住处 有好几台工作电脑&#xff0c;不同电脑不同OS有不同的用途&#xff0c;最大的问题就是各个电脑上文件的同步问题&#xff0c;这里当然就需要局域网里的公共文件夹&#xff0c;在NAS的问题上…

GenICam-GenApi简介

EMVA 1288标准之GemICam-GenApi学习与解读 背景介绍 当前相机不仅用于传输图像&#xff0c;还打包了越来越多的功能。这就导致相机的编程接口越来越复杂。 GenICam的目标是为所有类型的相机提供一个通用的编程接口&#xff0c;无论相机使用何种接口技术&#xff0c;或者实现…

vue3从精通到入门6:v-memo指令

v-memo是一个用于优化组件渲染性能的指令。它允许你根据某个条件来缓存组件的虚拟 DOM 树&#xff0c;从而在条件没有变化时避免不必要的重新渲染。这对于那些接收大量 props 且渲染成本较高的组件来说非常有用。 用法 v-memo 指令接受一个表达式或一个数组作为参数&#xff0…

JVM实战之性能调优[2](线程转储案例认识和分析)

文章目录 版权声明案例1&#xff1a;CPU占用率高问题问题描述解决思路补充内容 案例2&#xff1a;接口响应时间长问题问题描述解决思路Arthas trace命令Arthas watch命令解决问题 案例3&#xff1a;定位偏底层性能问题问题描述解决思路&#xff1a;Arthas火焰图问题解决 案例4&…

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

nimbus-jose-jwt库简单使用 公私钥字符串互相转换

nimbus-jose-jwt库简单使用 对称密钥签名非对称密钥对公私钥与字符串互相转换生成密钥对公私钥转字符串字符串转公私钥公钥字符串转公钥对象私钥字符串转私钥对象 maven坐标 <dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt&…

大话设计模式之原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它用于创建对象的复制&#xff0c;同时又能保持对象的封装。原型模式通过复制现有对象的方式来创建新的对象&#xff0c;而无需知道具体创建过程的细节。 在原型模式中&#xff0c;通常会有…