理解文件系统(上)

 模拟实现文件库

创建文件以便理解

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

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

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.mzph.cn/news/876345.shtml

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

相关文章

【虚拟机】 VMware截图版详细安装教程

VMware-workstation-full-17.5.1-23298084 的安装,详细安装过程。 1.以管理员身份运行安装包 点击文件,右键打开,以管理员身份运行; 2.根据安装提示,重启电脑; (重启与否看自己电脑情况&…

【深入理解SpringCloud微服务】深入理解Ribbon原理并手写一个微服务负载均衡器

深入理解Ribbon原理并手写一个微服务负载均衡器 负载均衡器理解Ribbon原理手写一个微服务负载均衡器总体设计LoadBalanceClientHttpRequestFactorySimpleLoadBalanceClientSimpleLoadBalancerLoadBalanceRulespring.factories与LoadBalanceConfig 负载均衡器 在微服务架构里面…

ElasticSearch(七)— 相关性检索和组合查询

一、 相关性评分 全文检索与数据库查询的一个显著区别, 就是它并不一定会根据查询条件 做完全精确的匹配。除了模糊查询以外,全文检索还会根据查询条件给文档的相关性打分并排序,将那些与查询条件相关性高的文档排在最前面。 相关性( Relev…

kubernetes service详解

一、service的类型 clusterip:集群内部访问externalname:调用外部API时使用,域名解析,让应用不用关心实际的IP地址nodeport:集群外部访问,暴漏节点上的端口,转发到pod内loadbalancer&#xff1…

【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 文末 公主号…

如何通过压缩提示降低GPT-4的成本

如果使用得当,LLMLingua可以降低使用高级LLM的成本,并使更广泛的用户和应用程序可以使用LLM。 像GPT-4和Claude这样的大型语言模型(LLM)可以通过良好的提示工程学习新任务。然而,较长的提示会增加使用这些模型的成本,并且还会减慢…

使用大型语言模型进行文档解析(附带代码)

动机 多年来,正则表达式一直是我解析文档的首选工具,我相信对于许多其他技术人员和行业来说也是如此。 尽管正则表达式在某些情况下功能强大且成功,但它们常常难以应对现实世界文档的复杂性和多变性。 另一方面,大型语言模型提供了…

vue3使用vue-i18n,调用t时指定语言获取翻译后的文本

今天碰到一个问题。就是使用i18n在调用t(‘key’)时,一般是直接返回当前语言文本。 比如我现在是简体。直接调用 t(‘commonBar.close’) 的话会返回简体 ‘关闭’。 但我现在这个地方返回其他语言,比如繁体。要怎么处理呢 查了文档,发现t函数…

writing classes ... [xxx of xxxx] 执行时间太长

一、问题展示 二、解决方法 打开设置【File - Settings…】修改堆大小

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足,执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足,执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

Qt基础 | 自定义界面组件 | 提升法 | 为UI设计器设计自定义界面组件的Widget插件 | MSVC2019编译器中文乱码问题

文章目录 一、自定义 Widget 组件1.自定义 Widget 子类2.自定义 Widget 组件的使用 二、自定义 Qt Designer 插件1.创建 Qt Designer Widget 插件项目2.插件项目各文件的功能实现3.插件的编译与安装4.使用自定义插件5.使用 MSVC 编译器输出中文的问题 一、自定义 Widget 组件 当…

Vue2从基础到实战(指令篇)

Vue中的常用指令! 概念:指令(Directives)是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。 vue 中的指令按照不同的用途可以分为如下 6 大类: 内容渲染指令(v-html、v-text) 条件渲染指令&…

计科录取75人!常州大学计算机考研考情分析!

常州大学(Changzhou University),简称“常大”,位于江苏省常州市,是江苏省人民政府与中国石油天然气集团有限公司、中国石油化工集团有限公司及中国海洋石油集团有限公司共建的省属全日制本科院校,为全国深…

C++~~string模拟实现(3)

目录 1.传统写法和现代写法 2.对于流提取的优化 3.简单机制了解 4.string类的几个构造函数总结 4.1基本用法 4.2两个赋值方式 4.3拷贝构造 4.4获取字符 4.5一个容易混淆的对比 4.6创建对象 1.传统写法和现代写法 (1)上面的代码里面的左边部分是…

51单片机-第五节-串口通信

1.什么是串口? 串口是通讯接口,实现两个设备的互相通信。 单片机自带UART,其中引脚有TXD发送端,RXD接收端。且电平标准为TTL(5V为1,0V为0)。 2.常见电平标准: (1)TTL电…

pycharm+pytorch+gpu开发环境搭建

一、安装anacoda 1、下载Anaconda安装包 官网下载地址 https://www.anaconda.com/distribution/ 清华镜像 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载python3.8对应的版本Anaconda3-2021.04-Windows-x86_64.exe 下载完成…

Vue中常用指令简介

一. V-html 作用:更新元素的innerHTML,拥有响应式的特点,即数据驱动视图,解析标签,作用类似于js中获取dom对象,然后再进行innerHTML赋值。 展示了一下v-html解析标签的特点,这算是和插值表达式…

【网络安全的神秘世界】文件包含漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 文件包含:重复使用的函数写在文件里,需要使用某个函数时直接调用此文件,而无需再…

【Linux】生产者消费者模型 + 线程池的介绍和代码实现

前言 上节我们学习了线程的同步与互斥,学习了互斥锁和条件变量的使用。本章我们将学习编程的一个重要模型,生产者消费者模型,并且运用之前学的线程同步和互斥的相关接口来实现阻塞队列和环形队列,最后再来实现一个简易的线程池。 …

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集,然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时,学习算法将最终返回正确的决策树吗?为什么是或不是? 本次有两个参考: 参考一: 当训练集的大小趋于无穷…