理解文件系统(上)

news2024/12/24 8:38:36

 模拟实现文件库

创建文件以便理解

 自己想实现的文件接口,进行模拟实现

模拟的头文件要准备的头文件 

open接口的实现

write接口的实现
fflush接口的实现

 flose接口的实现

文件实现 

stdio.h

stdio.c

test.c

makefile

创建makefile

编译运行

执行后输出log.txt,看到动态的输出那么如果此时把sprintf的\n去掉,发现在写的时候没有找到\n就一直不刷新,最后close的时候强制刷新 发现在执行中找不到log.txt的数据了而当close的时候才找到被强制刷新出去 

 这说明写入的时候我们对应的数据刚开始就没有在os内部文件内部,而是缓存在了自己定义的缓冲区里,说白了我们写了一大推的数据,但是所有数据都在你的file对象的缓冲区里,后面自动的帮我们做了一次结束时刷新一次,我们写了10次但是最后刷新了一次即只调用了一次系统调用,原本带\n是刷新10次。缓冲区暂时把数据缓冲起来,最后缓存数据量足够多经过一次IO就从内存里搬到os或文件里,大大减少IO次数提高效率;

C语言为什么要在FILE中提供用户级缓冲区?为了减少底层系统调用的次数,让使用C IO 函数(printf,sprintf等)效率提高(只是把数据放到缓冲区,我这个函数就返回了,至于这个数据怎么刷新由库决定)

0 1 2

我们写的程序,本质:都是对数据在进行处理(计算,存储...);

只要对数据处理就决定了--数据从哪里来(0),数据哪里去(1),用户看不看到这个过程;

理解2 

创建一个c语言文件,并向stdout和stderr写入


可以看到1和2都指向同一个显示器文件,要不然不可能向同一个显示屏打

那么这时候重定向到log.txt可以看到差别为什么向显示器打的stderr不向log.txt打,只有stdout打入了,这又是为什么呢?
首先我们要理解'>'是标准输出重定向,也就是说只会更改1号fd里面的内容

 为什么需要2呢?

因为在正常的情况下,我们平时在写程序的时候我们输出的消息有两类信息:正确的  错误的;
不管是正确的还是错误的都是向1号去打,但是实际上呢,我们如果写代码,正确的常见的信息往1里打,而一旦出错了往2里打就行,这样的话未来我们只需要做一次重定向就可以将正确的信息和错误的信息分开了;


1> ok.txt:将标准输出(文件描述符 1)重定向到文件 ok.txt。所有本来会输出到终端的内容,现在将会写入到 ok.txt 文件中。

2>err.txt:将标准错误输出(文件描述符 2)重定向到文件 err.txt。所有错误信息或警告,本来会输出到终端的内容,现在将会写入到 err.txt 文件中。

如果想将所有信息都放到一个里面:

记住重定向会清空文件内容的 !每打开一个文件就在内核中创建一个struct file!

 那么要区分一下perror:

此时重定向:发现没有成功
所以c语言当中的perror,例如perror(''open'')打开失败了本质是向2打印,为什么不用printf呢?因为printf是向1打印的;所以未来一旦有报错全部向2打入。

上面的都是在文件被打开的前提下;

未被打开的文件

但是linux中有很多文件,但是被进程访问打开的文件只是少数的;那么没有被打开的文件在哪里存放着呢? 就比如我写了一大推.c /.h 文件最后我只用了可执行文件,那么.c /.h都没被打开,那么他们在哪里呢?在磁盘上存放(即磁盘文件);

我们每次打开一个文件都是先找到这个文件,就需要在磁盘中找到,通过文件路径+文件名然后在磁盘中打开;

物理磁盘

 了解磁盘的存储结构

我们现在已经知道磁盘是一个机械设备,而且他是一个外设,注定了磁盘比较慢因为根据冯诺依曼体系得知外设IO慢,要减少与外设的IO次数;

文件=内容+属性===都是数据,都是二进制数据。所谓把文件存储在磁盘其实就是文件在磁盘中占有几个扇区!

对磁盘的存储进行逻辑抽象

我们走一遍os对磁盘这样的设备进行管理和抽象;为什么要抽象?如果os使用CHS的话,硬件改了软件也要改,耦合度太高。不想让软件直接访问硬件,也是为了方便实现内核进行磁盘管理 ;

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

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

相关文章

宏集物联网工控屏网关实现Modbus TCP数据采集并通过TCP转发

前言 在日常的生产活动中,许多企业需要使用底层PLC或传感器数据,但部分企业的终端平台仅支持TCP协议,而不支持常见的PLC或Modbus协议。为了实现兼容性,需要使用协议转换网关,将底层协议转换为TCP协议。 宏集物联网工…

Python客户端操作Elasticsearch

一.Python与Elasticsearch交互示例 这段代码是使用Python的elasticsearch模块与Elasticsearch进行交互的示例: from elasticsearch import Elasticsearch# 一.创建连接 # 建立到Elasticsearch的连接,指定主机和端口,设置请求超时时间为3600…

【数据结构】单链表面试题(Java + 力扣 + 详解)

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

【日常记录】【插件】Typed.js:用于创建打字效果的 JavaScript 库

文章目录 1. 引言2. 安装3. 基本使用参考链接 1. 引言 Typed.js是一个用于创建打字效果的 JavaScript 库。这个效果就是 chatgpt、百度的文心一言等其他的大模型,回复用户的问题的时候的效果 typed-js 官网typed 案例 2. 安装 CDN方式 这俩都可以,还有其…

17 推荐系统方案中那些不得不知的坑

你好,我是大壮。《易经》中说:“上九:亢龙有悔”。上九是指阳爻在卦中处于最高位,亢龙是指飞向尽头的龙,穷尽至极力终有尽时,力尽则悔,悔不可及。 在前面的 18 讲我们已经讨论了整个推荐算法的…

C语言中的IO控制流

文章目录 一、什么是C语言中的IO控制流二、open函数 1.使用open函数创建文件2.使用使用open函数打开文件三、文件的权限四、文件的描述符五、read函数六、write函数七、lseek函数八、close函数 一、什么是C语言中的IO控制流 在linux系统中一切皆文件,C语言中的IO控…

【SQL 新手教程 4/20】关系模型 --索引

💗 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record): 表的每一行称为记录(Record),记录是一个逻辑意义上的数据 字段 (Column):表的每一列称为字段(Colu…

Java | Leetcode Java题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; class Solution {public String getHint(String secret, String guess) {int bulls 0;int[] cntS new int[10];int[] cntG new int[10];for (int i 0; i < secret.length(); i) {if (secret.charAt(i) guess.charAt(i)) {bulls;} e…

C语言条件语句中switch语句的一些用法

目录 1. switch语句写一个简单的switch语句 2. if语句和else语句的对比判断3的倍数情况 3. switch语句中break详解4. switch语句的一项小练习5. switch语句中的default6. switch语句中的顺序问题 1. switch语句 C语言除了if...else...作为条件语句外&#xff0c;还提供了switc…

Java(十)——接口

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

数据库表的行列转换(行转列,列转行)

目录 前言 行转列 创建测试表 score1 插入测试数据 需求与通用SQL写法 列转行 创建测试表 score2 插入测试数据 需求与通用SQL写法 前言 在工作中&#xff0c;多多少少都会遇到一些数据展示的需求&#xff0c;开发一个接口&#xff0c;从数据库中查询数据返回页面展示…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城&#xff0c;主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览&#xff1b; 后台是…

Langchain核心模块与实战[8]:RAG检索增强生成[loader机制、文本切割方法、长文本信息处理技巧]

Langchain核心模块与实战[8]:RAG(Retrieval Augmented Generation,检索增强生成) RAG(Retrieval-Augmented Generation)技术是一种结合检索和生成功能的自然语言处理(NLP)技术。该技术通过从大型外部数据库中检索与输入问题相关的信息,来辅助生成模型回答问题。其核心…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点&#xff0c;这个知识点也很抽象&#xff0c;需要我们很好的掌握&#xff0c;而且快速排序的代码也是非常重要&#xff0c;需要我们懂了还不行&#xff0c;必须要手撕代码&#xff0c;学的透彻。 在研究快速排序之前&#xff0c;我们首先…

使用 Arduino 实现 PID 控制器

使用 Arduino 实现 PID 控制器 PID controller implementation using Arduino (microcontrollerslab.com) In this article, you will learn how to design PID controller using Arduino. PID controller can implemented using both analog and digital electronics. But in…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类&#xff08;修饰类除外&#xff09;&#xff1f; 一个 Java 文件中是可以存在多个类的&#xff0c;但是一个 Java 文件中只能存在一个 public 所修饰的类&#xff0c;而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化&#xff0c;势必造成CPU资源的浪费&#xff0c;因此优化执行效率的思路是&#xff1a;UI组件不再自行每帧查询血量&#xff0c;而是让血量自己在发生变化的同时通知UI进…

软件全过程建设资料,交付资料,方案等

在软件开发过程中&#xff0c;文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程&#xff0c;还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用&#xff0c;以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档编写…

【机器学习】深入理解损失函数(Loss Functions)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

[译] 深入浅出Rust基金会

本篇是对 RustConf 2023中的Rust Foundation: Demystified这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 大家好,我是Sage Griffin,我的代词是they/them。我今天来这里是要谈谈Rust基金会。 要了解基金会实际做什么,我们需要理解美国国内税收…