【Linux】缓冲区的理解

news2024/9/24 8:24:04

文章目录

  • 什么是缓冲区?
  • 为什么要有缓冲区?
  • 缓冲区刷新策略
  • 请看下面代码:

接着上篇【Linux】文件操作|文件描述符|重定向

什么是缓冲区?

我们口中说的缓冲区,一般指的是用户级语言层面给我们提供的缓冲区。本质就是一段内存。
具体在C语言文件操作的中FILE结构体中。它内部不仅有文件描述符fd还有缓冲区。

为什么要有缓冲区?

比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

缓冲区刷新策略

缓冲区会结合具体的设备,制定适合自己的刷新策略。
1.立即刷新,无缓冲。
2.行刷新,行缓冲。
一般是在显示器上,因为要适应我们人类的阅读习惯。从左到右。一次阅读。 而不是一次刷新一大片。这样不方便阅读。
3.缓冲区已经满了,这时就要全缓冲。
一般对应的是磁盘文件。

其他情况:
1.用户强制刷新。
2.进程退出时要进行缓冲区刷新。

请看下面代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    // C接口
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    const char *fputsString = "hello fputs\n";
    fputs(fputsString, stdout);


    // 系统接口
    const char *wstring = "hello write\n";
    write(1, wstring, strlen(wstring));

    
    fork(); // fork

    return 0;
}

运行结果:
在这里插入图片描述
解释:
代码结束之前,进行创建子进程

  1. 如果我们没有进行重定向>,看到了4条消息,stdout 默认使用的是行刷新,在进程fork之前,三条C语言函数已经将数据进行打印输出到显示器上(外设),FILE内部的缓冲区中已经不存在对应的数据了。
  2. 如果我们进行了重定向>, 写入的文件不再是显示器stdout,而是普通文件,采用的刷新策略是全缓冲,之前的3条c语言函数虽然带了\n,但不足以将普通文件的缓冲区写满!数据并没有被刷新,就是现在缓冲区里还存在未被刷新的数据。
    执行fork创建子进程之后, 子进程把缓冲区的整体复制了一份,然后紧接着就是return 0 进程退出!谁先退出,一定要进行缓冲区刷新,那么这时候缓冲区就要被修改了,OS为了保证进程独立性,就要进行写时拷贝,所以数据最终会显示两份。
  3. write为什么没有打印两次呢?上面的过程都和wirte无关,wirte是系统调用,没有结构体指针FILE,用的是fd,就没有C提供的缓冲区,就不存在缓冲区被修改的问题。

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

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

相关文章

nRF24L01芯片(模块)介绍

nRF24L01芯片&#xff08;模块&#xff09;简介nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设…

使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss

前言 什么是 RSS? RSS 是一种描述和同步网站内容的格式&#xff0c;是使用最广泛的 XML 应用。RSS 搭建了信息迅速传播的一个技术平台&#xff0c;使得每个人都成为潜在的信息提供者。发布一个 RSS 文件后&#xff0c;这个 RSS Feed 中包含的信息就能直接被其他站点调用&…

【MySQL】SQL查询语句在MySQL中的执行过程

文章目录1.MYSQL基础架构2.连接器3.查询缓存4.解析SQL5.执行SQL5.1 预处理器5.2 优化器5.3 执行器6.总结1.MYSQL基础架构 连接器&#xff1a;建立连接、管理链接、校验用户身份查询缓存&#xff1a; 查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。&#xf…

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 超级帅帅吴 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录基于JavaSpringBootvueelement疫情物资捐赠分配…

不能你说对不起,别人就一定要说没关系——与九迁沟通他的冲动和错误

今天的事情是最近三天九迁与他奶奶之间发生的事情。先说前面在谈事件&#xff0c;这个事情的发生&#xff0c;首先说明我母亲的身体还可以&#xff0c;没有被感染&#xff0c;因为还能和孩子生气&#xff0c;说明熊胆粉确实是在起作用&#xff0c;关于熊胆粉的文章请看&#xf…

FGH40N60SMD 600V 80A 349W 逆变器高频IGBT单管

FGH40N60SMD 600V 80A 349W 逆变器高频IGBT单管 &#xff0c;为光伏逆变器、UPS、焊机、通讯、ESS 和 PFC 等低导通和开关损耗至关重要的应用提供最佳性能。IGBT单管系列&#xff1a;FGH40N60SMDFGH60N60SMDFGH75T65SHD-F155 NGTB40N120FL2WG特性&#xff1a;1.最大结温 T[siz…

C++:二叉树题进阶(三种非递归遍历、二叉搜索树OJ题)

lc 606 根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有不影响字符串与原始…

C++4:C++中的动态内存管理

目录 C内存管理方式 new/delete操作内置类型&#xff1a; new/delete操作自定义类型&#xff1a; new和delete的底层实现&#xff1a; operator new与operator delete函数 定位new 内存泄漏 动态内存管理&#xff0c;早些我们接触C语言的时候就已经在很熟练的游玩在堆上开…

QGIS加载谷歌地图(google map)方法

目录第一步第二步将Google提供的网络地图&#xff0c;包括地图和卫星影像等&#xff0c;作为图层加载到QGIS中&#xff0c;有时可辅助地学分析。QGIS已经提供了OpenStreetMap&#xff0c;在 “XYZ Tiles” 里面加载即可。 谷歌街道地图&#xff1a;http://mt2.google.com/vt/ly…

缓冲区的深刻理解

代码&&现象 先来看一份代码 #include <stdio.h> #include <string.h> #include <unistd.h> int main() {//C Libraryprintf("hello printf\n");fprintf(stdout, "hello fprintf\n");const char *s1 "hello fwrite\n&quo…

微信公众号开发以及测试公众号菜单配置

微信公众号开发测试号申请测试号配置公众号菜单配置1、获取access_token2、新增自定义菜单微信扫描关注公众号微信公众平台测试号申请 1、测试号申请 开发的时候需要一个个人的公众号调试&#xff0c;所以使用微信测试号进行。 1、微信测试号申请地址: https://mp.weixin.qq.c…

用于野外精确人体姿态估计的自适应多视图融合

用于野外精确人体姿态估计的自适应多视图融合 Abstract AdaFuse&#xff1a;一种自适应的多视图融合方法&#xff0c;利用可见视图中的特征增强被遮挡视图中的特征核心&#xff1a;确定两个视图之间的点-点对应关系 通过研究热图表示的稀疏性 我们还学习了一个自适应的融合…

ArcGIS基础实验操作100例--实验48按分区划分矢量图层

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验48 按分区划分矢量图层 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

属于 PingCAP 用户和开发者的 2022 年度记忆

2022 年&#xff0c;我们一起穿越了许多荆棘时刻&#xff0c;面对着前所未有的不确定性。在这些挑战面前&#xff0c;我们发现技术和开发者扮演了重要角色。 技术为我们提供了穿越周期的桥梁&#xff0c;开发者帮助我们更好地应对挑战&#xff0c;解决问题并赋予这个世界更多创…

Qt——项目:翻转金币游戏

目录 一.示例演示 二.制作思路 &#xff08;一&#xff09;.准备资源及总体框架 &#xff08;二&#xff09;.开始窗口 &#xff08;三&#xff09;.选择关卡窗口 &#xff08;四&#xff09;.游戏窗口 &#xff08;五&#xff09;.优化 三.实现代码 &#xff08;一&a…

电脑系统格式化需不需要重装系统

​有小伙伴反应系统中毒无法彻底杀毒&#xff0c;不知道格式化需不需要重装系统吗那么下面小编给大家说说并且带来格式化重装系统步骤图解。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型号&#xff1a;惠普战66五代 软件版本&#xff1a; 方法/步骤&…

【LeetCode】1802. 有界数组中指定下标处的最大值

1802. 有界数组中指定下标处的最大值 题目描述 给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length nnums[i] 是 正整数 &#xff0c;其中 0 < i < nabs(nums…

怎么做form表单校验

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式表单校验1、input框生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的…

小程序从启动到发版

记录一下从拿到项目启动到发版的流程。 每个uniapp项目&#xff0c;管理员都会给你下发权限&#xff0c;用微信扫一扫登录 小程序官网 你可以在手机上看到你所有的权限账号&#xff0c;选择当前项目登录&#xff08;没有就是没下发你权限&#xff0c;找他去&#xff09; 开…

知道了这些vim编辑器使用小技巧可以让你写代码的速度直接飞起

文章目录一、前言二、Vim 编辑器的简单介绍2.1 命令模式2.2 输入模式2.3 底部命令模式2.4 三种模式的切换三、Vim 编辑器常用操作3.1 Vim 最基本的操作3.2 Vim 的光标移动操作3.3 多窗口同时打开多个文件四、一些其他的 Vim 小技巧一、前言 相信学习过Linux的朋友们对于Vim编辑…