进程与文件

news2024/9/28 7:16:38

目录

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

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

相关文章

Linux:环境变量的特性及获取

目录 一、环境变量基本概念 1.1命令行参数 1.2常见环境变量 二、环境变量相关指令 创建本地变量 三、环境变量通常是具有全局属性的 一、环境变量基本概念 环境变量(environment variables)不是一个而是一堆,彼此之间其实没有关系。本质上是为了解决不同场景下…

Transformer的前世今生 day10(Transformer编码器

前情提要 ResNet(残差网络) 由于我们加更多层,更复杂的模型并不总会改进精度,可能会让模型与真实值越来越远,如下: 我们想要实现,加上一个层把并不会让模型变复杂,即没有它也没关系…

【JavaWeb】Day24.Web入门——SPringBootWeb入门

什么是SPring? 我们可以打开Spring的官网(Spring | Home),去看一下Spring的简介:Spring makes Java simple。Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流…

数据库是怎么做到事务回滚的呢?

数据库实现事务回滚的原理涉及到数据库管理系统(DBMS)如何维护事务的一致性和持久性。 基本原理: ACID属性:事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Iso…

Elasticsearch从入门到精通-07ES底层原理学习

Elasticsearch从入门到精通-07ES底层原理和高级功能 👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES底层原理包括集群原理、路由原理、分配控制、分配原理、文档分析原理、文档并发安全原理以及一些高…

【热门话题】ECMAScript vs JavaScript:理解两者间的联系与区别

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 ECMAScript vs JavaScript:理解两者间的联系与区别1. ECMAScript&am…

创建一个vue3 + ts + vite 项目

vite 官网: https://cn.vitejs.dev/guide/ 兼容性注意 Vite 需要 Node.js 版本 18,20。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 安装项目 1. 使用n…

【Redis主从架构。主从工作原理psync、bgsave、部分数据复制、主从复制风暴解决方案】【Redis哨兵高可用架构。sentinel】

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了,集群从新选择主节点,并且同步给sentinel 转自图灵课堂 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关…

基于java+springboot+vue实现的成都旅游网系统(文末源码+Lw+ppt)23-358

摘 要 人类现已迈入二十一世纪,科学技术日新月异,经济、资讯等各方面都有了非常大的进步,尤其是资讯与网络技术的飞速发展,对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利,发展一套成…

Linux系统使用Docker部署MongoDB数据库并实现无公网IP远程访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署Mon…

Linux Php 连接 SAP Hana数据库客户端

下载地址 : SAP Development Tools https://tools.hana.ondemand.com/#hanatools 进入hanaclient-2.19.21-linux-x64 无需编译,运行 ./hdbinst 提示没有权限,执行chmod x * 有个子目录里面的也是没有权限,进入那个子目录 执行chmod …

通过测量扭矩和转角法评估紧固件的连接质量——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 扭矩转角法是一种用于测量材料力学性能和评估紧固件连接质量的重要方法。其原理基于材料在受到扭矩作用时产生的弹性变形和塑性变形,通过测量施加在紧固件上的扭矩和对应的转角关系,来推断材料的…

浅模仿小米商城布局(有微调)

CSS文件 *{margin: 0;padding: 0;box-sizing: border-box; }div[class^"h"]{height: 40px; } div[class^"s"]{height: 100px; } .h1{width: 1528px;background-color: green; } .h11{background-color:rgb(8, 220, 8); } .h111{width: 683px;background-c…

PLC/FA 电机信号隔离控制模拟信号数据隔离采集变换分配器0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA

主要特性: >>精度等级:0.1级、0.2级。产品出厂前已检验校正,用户可以直接使用 >>辅助电源:5V/12V/15V/24VDC(范围10%) >>国际标准一路信号输入:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等 >>…

【详细讲解React 快速入门教程】

🔥博主:程序员不想YY啊🔥 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家💫 🤗点赞🎈收藏⭐再看💫养成习惯 🌈希望本文对您有所裨益,如有…

稀碎从零算法笔记Day26-LeetCode:跳跃游戏

断更多天,懒狗ex 题型:数组、模拟、类似双指针? 链接:55. 跳跃游戏 - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组…

JAVA批量下载

环境: JDK:1.7.0_80 tomcat:7.0.47 工程截图: 1.布署到tomcat 2.在浏览器中访问 启用数据库支持 启用数据库后下载信息将会保存在数据库中。在关闭重启浏览器后仍然可以继续下载。 将“DataBase”配置为true则为启用数据库支持 使用mysql文件夹下的脚…

【算法刷题】链表笔试题解析(1)

一、链表分割 题目描述: 链接:链表分割 题目分析: 这题直接处理并不好做,我们可以构建前后两个链表,将小于x值的结点放在链表a内,将其它结点放在链表b内,这样将原链表遍历完后,原链…

FKSS型煤层注水封孔器向光而行

要保持自己喜欢的样子 不要随波逐流 也不要过度失落 温柔的人 会有一个好的结局 结构特点 封孔器是由注水喷头、固定螺母管芯、单向阀、膨胀胶管、扣压外套、扣压芯子、注水连接体组成。 水分注入煤体,能湿润和破碎煤体,释放部分瓦斯,降低煤…

TreeMap集合 -java学习笔记

TreeMap TreeMap (由键决定特点):按照键的大小默认升序排序、不重复、无索引特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序 TreeSet&#xff…