【Linux基础IO】深入理解缓冲区

缓冲区在文件操作的过程中是比较重要的,理解缓冲区向文件刷新内容的原理可以更好的帮助我们更深层的理解操作系统内核对文件的操作。

FILE

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过文件描述符fd访问的。所以C库当中的FILE结构体内部必定封装了文件描述符fd。

bff8a8624f4543188f72a787a76fbbbf.png

缓冲区分析

2943da57885e41e1a3d6ba3297973942.png

刷新方式

刷新指的是:将用户级缓冲区里的内容刷新到内核级缓冲区里。

1.无缓冲 ----- 直接刷新

2.行缓冲 ----- 遇到\n刷新(向显示器文件写入内容)

3.全缓冲 ----- 用户级缓冲区满了才刷新(向普通文件里写入内容)

进程退出时也会刷新

 向显示器文件写入内容的过程:

当我们调用对文件写操作c库函数(printf、fprintf,fwrite)向显示器文件写入内容,首先是将内容写到FILE的c提供的缓冲区里,刷新方式采取2.遇到\n刷新,我们调用的c库函数就会调用它封装的write,write根据FILE里的fd在内核中找到对应的文件结构体对象里指针指向的缓冲区里;当我们调用系统调用write时,write将内容直接写到被写入文件结构体对应的内核缓冲区里,然后由操作系统将内容传送到磁盘。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
  int main()
  {
    const char* str ="linux";
    const char* str1 = "OS";
    //库函数
    fprintf(stdout, "hello");
    fwrite(str, strlen(str), 1, stdout);
    //系统调用
    write(1, str1, strlen(str1));                                                                                                                        
    close(1);                                                                                                                                
    return 0;                                                                                                                                
  }

4155da52c50b4030a0e6419cc03b0f82.png

 可以看到close了fd=1的文件(即显示器文件),库函数fprintf、fwrite函数和系统调用write里的要向显示器文件输入的字符串末尾都无\n,但是为什么只有系统调用向显示器文件成功写入了字符串呢?这是因为c库对文件操作函数内部提供了缓冲区。另外,我们这里所说的缓冲区, 都是用户级缓冲区。write系统调用将要写入显示器文件的内容直接写到内核级缓冲区,因此可以打印出write写入的内容;c库函数由于要等到进程退出才可以将内容从用户级缓冲区刷新到内核级缓冲区,但在进程退出前,调用了close(1),关闭了显示器文件,因此显示器文件结构体对应的内核级缓冲区被关闭了,无法向里面刷新内容,也就无法将内容写入到磁盘里的显示器文件。如果要写入的字符串末尾都加了\n(刷新方式为)那么就全部会被写入到显示器文件里,并由显示器打印出来。

2f132490329d4dfbb842f78643479d4f.png

向普通文件写入内容的过程:

过程和向显示器文件写入内容一样,刷新方式采取3.全缓冲。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
  int main()
  {
    const char* str ="linux";
    const char* str1 = "OS";
    //库函数
    fprintf(stdout, "hello");
    fwrite(str, strlen(str), 1, stdout);
    //系统调用
    write(1, str1, strlen(str1));                                                                                                                        
    fork();                                                                                                                                
    return 0;                                                                                                                                
  }

f8623a0f44ca4bc8968fcf2d618aa55d.png

为什么c库函数写入的内容写入到text.txt了两遍?

调用库函数向文件text.txt写入文件时刷新方式为3.全缓冲,也就是说只有进程退出时才可以刷新,因为fork()创建了子进程,向内核缓冲区刷新内容时,子进程的内核缓冲区内存空间发生写时拷贝。

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

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

相关文章

国内外大模型生态发展报告!

很多同学只知类似Check GPT或者说对国内的一些比较了解&#xff0c;对国外的不太了解&#xff0c;所以在这总结。 1 大模型的发展 左表 名称参数特点发布时间GPT-215亿英文底模&#xff0c;开源2019年Google T5110亿多任务微调, 开源2019年GPT-3.51750亿人工反馈微调2022年M…

Django 循环模板标签

1&#xff0c;循环模板标签 Django 模板系统中提供了多种循环模板标签来迭代数据并显示列表、字典或其他可迭代对象。 1.2 {% for %} 标签 用于迭代列表或可迭代对象&#xff0c;并为每个元素提供上下文变量。 {% for item in items %}{{ item }} <!-- 渲染当前迭代项 -…

第二次IAG

IAG in NanJing City 我与南京奥体的初次相遇&#xff0c;也可能是最后一次&#xff01; 对我来说,IAG 演唱会圆满结束啦! 做了两场充满爱[em]e400624[/em]的美梦 3.30号合肥站&#xff0c;6.21号南京站[em]e400947[/em] 其实&#xff0c;没想到昨天回去看呀!(lack of money […

docker简单快速使用上手

1.Docker是什么&#xff1f; Docker 是一个开源的容器化平台&#xff0c;主要用于开发、运输和运行应用程序。它通过提供轻量级的虚拟化机制&#xff0c;使得开发者可以在一个隔离的环境中运行和管理应用程序及其依赖项。Docker 的核心组件包括镜像&#xff08;Image&#xff…

数据库浅识及MySQL的二进制安装

数据库基础概念与MySQL二进制安装与初始化 使用数据库的必要性 数据库可以结构化储存大量数据信息&#xff0c;方便用户进行有效的检索访问 有效的保持数据信息的一致性&#xff0c;完整性&#xff0c;降低数据冗余 可以满足应用的共享和安全方面的要求 数据库基本概念 数据…

Redis学习|Redis 是什么、Redis 能干嘛、Window安装Redis、Linux下安装Redis、Redis测试性能

Redis 是什么? Redis(Remote Dictionary Server)&#xff0c;即远程字典服务! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API. redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记…

C++:STL容器-map

C:STL容器-map 1. map构造和赋值2. map大小和交换3. map插入和删除4. map查找和统计5. map容器排序 map中所有元素都是pair&#xff08;对组&#xff09; pair中第一个元素为key&#xff08;键&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实…

揭秘古代手术工具与技术:从中国起源的医疗奇迹

在人类历史的长河中&#xff0c;医学的发展一直是推动社会进步的重要力量。而手术作为医学的一个重要分支&#xff0c;其发展历程同样充满了传奇色彩。今天&#xff0c;我们将带您走进古代手术的世界&#xff0c;揭秘那些令人惊叹的手术工具和技术。 这把手术刀出土于河北西村遗…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口切换SMB共享WMI管道DCOM组件Impacket套件CS插件

红队内网攻防渗透 1. 内网横向移动1.1 WMI进行横向移动1.1.1 利用条件:1.1.1 利用详情1.1.1.1 wmic1.1.1.1.1 正向shell上线1.1.1.1.2 反向shell上线1.1.1.2 cscript(不建议使用)1.1.1.3 wmiexec-impacket1.1.1.4 cs插件1.2 SMB横向移动1.2.1 利用条件:1.2.2 利用详情1.2.2…

java中Object和json相互转换的方式

1.org中jackson转换json,springboot中内置jackson ObjectMapper onew ObjectMapper(); List<>listnew ArrayList(); String jonso.writeAsValueString(list); 2.alibaba中fastjson转换成json GetMapping("/test")public TbUser testHttpClient(){String url…

BFS:解决最短路问题

文章目录 什么是最短路问题&#xff1f;1.迷宫中离入口最近的出口2.最小基因变化3.单词接龙4.为高尔夫比赛砍树总结 什么是最短路问题&#xff1f; 最短路问题是图论中的经典问题&#xff0c;旨在寻找图中两个节点之间的最短路径。常见的最短路算法有多种&#xff0c;这次我们…

计算机组成原理 | 硬件电路整理

计算机组成原理 | 硬件电路整理 桶形移位器原理图 全加器逻辑框图 多位可控加减法电路逻辑框图 可级联的4位先行进位电路 4位快速加法器 16位组内并行、组间并行加法器 实现原码一位乘法的逻辑框图 补码一位乘法的逻辑框图 无符号数阵列乘法器 原码不恢复余数法硬件逻辑框图 基…

代码随想录第31天|贪心算法

134. 加油站 参考 思路: 以每个油站相差作为判断, 比如: gas [5 8 2 8]cost [6 5 6 6] [-1 3 -4 2]错误 : 把相差最大点当作起点判断能否绕一圈 : 相加数组是否小于0局部最优: 当前累加rest[i]的和curSum一旦小于0&#xff0c;起始位置至少要是i1&#xff0c;因为从i…

中国信通院专访镜舟科技:开源商业化走了多远?

据《2023 中国开源发展蓝皮书》显示&#xff0c;随着数字化转型的深入&#xff0c;开源生态在去年快速发展&#xff0c;开源商业化的模式也逐渐成型。镜舟科技作为开源商业化的先行者&#xff0c;也在技术创新和商业拓展中稳步增长。 日前&#xff0c;中国信息通信研究院&…

【Gradio】如何设置 Gradio 数据框的样式

简介 数据可视化是数据分析和机器学习的关键方面。Gradio DataFrame 组件是一种流行的方式&#xff0c;在网络应用程序中显示表格数据&#xff08;特别是以 pandas DataFrame 对象的形式&#xff09;。 本文将探讨 Gradio 的最新增强功能&#xff0c;这些功能允许用户整合 pand…

21.智能指针(上)

目录 一、概念二、Box\<T\>2.1 概念与应用场景2.2 简单应用2.3 递归类型的创建 三、通过Deref trait将智能指针当作常规引用处理3.1 常规引用3.2 像引用一样使用Box\<T\>3.3 自定义智能指针3.4 函数和方法的隐式解引用强制转换3.5 解引用强制转换与可变性交互 四、…

WPF文本绑定显示格式StringFormat设置-数值类型处理

绑定显示格式设置 在Textblock等文本控件中&#xff0c;我们经常要绑定一些数据类型&#xff0c;但是我们希望显示的时候能够按照我们想要的格式去显示&#xff0c;比如增加文本前缀&#xff0c;后面加单位&#xff0c;显示百分号等等&#xff0c;这种就需要对绑定格式进行处理…

SpringBoot 搭建sftp服务 实现远程上传和下载文件

maven依赖&#xff1a; <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…

【CSS in Depth2精译】1.4 简写属性

文章目录 1.4 简写属性1.4.1 当心简写属性悄悄覆盖其他样式1.4.2 记住简写值的顺序1 上、右、下、左顺序2 先水平、再垂直的顺序 1.4 简写属性 简写属性&#xff08;Shorthand properties&#xff09; 是可以一次性设置多个属性值的样式属性。例如&#xff0c; font 就是一个简…

考前刷题练手感(北航期末往年数据结构编程题)

本次因为是考前一天极速刷题&#xff0c;所以没有讲解&#xff0c;若有问题可私信。 目录 一、 查找同时空人员二、 老鼠回家-无回路三、函数调⽤关系四、东二食堂模拟五、栈帧 一、 查找同时空人员 【问题描述】 假设一共有6个手机基站&#xff0c;都具有记录手机连接基站状…