【Linux】认识文件(三):缓冲区

【Linux】认识文件(三):缓冲区

  • 一.啥是缓冲区?
  • 二.缓冲区现象
  • 三.缓冲区的刷新方法
  • 四.缓冲区在哪?
  • 五.为什么要有缓冲区

一.啥是缓冲区?

缓冲区,官方说法就是:指的是一块用于临时存储数据的内存区域。
它通常用于数据的输入和输出操作之间,作为数据的中转站,用于平衡输入和输出设备之间的速度差异。

这么会说肯定不太好理解,所以接下来,就给大伙解开缓冲区的面纱。

二.缓冲区现象

#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{const char* message0="hello fwrite\n";const char* message2="hello printf\n";fwrite(message0,strlen(message0),1,stdout);//在显示器文件中fwrite message0printf("%s",message2);//在显示器文件中打印write message1fork();//创建子进程
}

./test
来运行这个程序
结果如下:在这里插入图片描述

大伙可能觉得这也没啥

但是如果我们将结果重定向给文本文件:

./test > test.log

结果如下:
在这里插入图片描述

这里我们能发现这里面
fwrite和printf被打印了两次

这里其实就是缓冲区的展现了。

在这里插入图片描述
大致情况就是这样了。

三.缓冲区的刷新方法

但是这里细心的人可能会有别的疑惑了

为什么正常运行程序是两条
在这里插入图片描述
反而重定向到文件中的时候反而多了两条呢?

在这里插入图片描述
这里就要牵扯到缓冲区的刷新方式了:

缓冲区刷新问题:

  • a无缓冲 ----->直接刷新
  • b:**行缓冲 ----->遇到\n进行刷新 **
  • c:**全缓冲 ----->全部一次性进行刷新 **
  • 进程退出时候会刷新

要注意:
一般显示器中的刷新方式是行缓冲
一般文件的刷新方式是全缓冲

所以我们这里可以来分析一下了

输出到显示器:
在这里插入图片描述
输出到文件:
在这里插入图片描述

这里大伙应该就能明白不同刷新方式的区别的。

这里没有最好的刷新方式,只有最合适的刷新方式。

四.缓冲区在哪?

为什么要问这个问题呢?

先带大伙来对上面的代码进行小小的改动:

#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{const char* message0="hello fwrite\n";const char* message1="hello write\n";const char* message2="hello printf\n";fwrite(message0,strlen(message0),1,stdout);//在显示器文件中fwrite message0write(1,message1,strlen(message1));//在显示器文件中write message1printf("%s",message2);//在显示器文件中打印write message1fork();//创建子进程
}

正常输入到显示器中
在这里插入图片描述
结果还是如我们所料

但是如果输出到文件中呢?

在这里插入图片描述
这里我们能发现这里write的官方接口没有被打印两次

所以我们能猜到:
write直接就打印了出来,没有进入缓冲区中
因为子进程会复制缓冲区,如果write进入缓冲区的话
就会被子进程给复制,从而出现两条write

这里我们其实就能给出猜想了:
这个缓冲区只是在C库中,和系统没关系

其实答案真的如我们所想

操作系统中其实也会有缓冲区,但是不是我们用户能够管制
但是C库中的缓冲区是用户级的,我们能够感受到

一般语言都会有自己的用户级缓冲区,不光是C语言

这里再来带大伙来验证一下:

众所周知:
_exit是系统接口 exit是C库中接口

所以讲道理,C缓冲区的话,_exit是不会处理的
但是exit是C接口,所以exit会进行处理。

这里我们来对比一下:

 #include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(){printf("test");_exit(1);                                                                                   }

结果:
在这里插入图片描述

 #include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(){printf("test");exit(1);                                                                                   }

结果:在这里插入图片描述结果和我们想的一样

五.为什么要有缓冲区

为什么要有这个缓冲区:

  • 提高程序员的效率
    通过将数据传给系统和硬件的工作交给语言
  • 缓冲区的解决输入和输出设备之间的速度不匹配问题
    原理:当数据从一个设备传输到另一个设备时,数据的传输速度可能会有所不同。
    例如,当从硬盘读取大量数据时,硬盘的读取速度相对较慢,而将数据发送到网络或显示器等设备时,速度可能要求更快。为了使这些设备之间的数据传输更加高效,可以使用缓冲区来调节数据的流动

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

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

相关文章

LeetCode 409—— 最长回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 要想组成回文串&#xff0c;那么只有最中间的字符可以是奇数个&#xff0c;其余字符都必须是偶数个。 所以&#xff0c;我们先遍历一遍字符串&#xff0c;统计出每个字符出现的次数。 然后如果某个字符出现了偶…

vi, vim,data,wc,系统常用命令-读书笔记(十)

vi 文本编辑器 基本上 vi 共分为三种模式&#xff0c;分别是“一般指令模式”、“编辑模式”与“命令行命令模式”。这三种模式的作用分别是&#xff1a; 一般指令模式&#xff08;command mode&#xff09;以 vi 打开一个文件就直接进入一般指令模式了&#xff08;这是默认的…

Compose 简单组件

文章目录 Compose 简单组件TextText属性使用AnnotatedStringSpanStyleParagraphStyle SelectionContainer 和 DisableSelectionClickableText TextFieldTextField属性使用OutlinedTextFieldBasicTextFieldKeyboardOptions 键盘属性KeyboardActions IME动作 ButtonButton属性使用…

玩转压力管理,轻松高效编程

程序员缓解工作压力的小窍门 在当今快速发展的科技时代&#xff0c;程序员作为数字世界的建筑师&#xff0c;面临着高强度、高压力的工作环境。为保持工作效率和创新能力&#xff0c;同时也确保身心健康和个人热情的持久续航&#xff0c;采取科学合理的减压策略至关重要。 方…

一二三应用开发平台使用手册——系统管理-用户组-使用说明

概述 在RBAC模型中&#xff0c;资源、角色、用户三个关键元素&#xff0c;构成权限体系。在平台设计和实现的时候&#xff0c;以下几个核心问题思考如下&#xff1a; 角色&#xff0c;单层平铺还是树形结构&#xff1f; 在小型应用中&#xff0c;角色数量有限的情况下&#x…

高级数据结构—树状数组

引入问题&#xff1a; 给出一个长度为n的数组&#xff0c;完成以下两种操作&#xff1a; 1. 将第i个数加上k 2. 输出区间[i,j]内每个数的和 朴素算法&#xff1a; 单点修改&#xff1a;O( 1 ) 区间查询&#xff1a;O( n ) 使用树状数组&#xff1a; 单点修改&#xff1a…

17-软件脉冲宽度调制(SW_PWM)

ESP32-S3的软件脉冲宽度调制&#xff08;SW_PWM&#xff09; 引言 ESP32-S3 LED 控制器LEDC 主要用于控制 LED&#xff0c;也可产生PWM信号用于其他设备的控制。该控制器有 8 路通道&#xff0c;可以产生独立的波形&#xff0c;驱动 RGB LED 等设备。LED PWM 控制器可在无需C…

CLion远程调试

一 CLion远程调试 ## 1.1 建立远程连接过程 设置——部署——“”——SFTP——新建服务器名称——输入主机、用户名、密码信息——确定 工具链建立远程主机 设置——工具链——“”——远程主机——凭据新增服务器信息 上传本地代码到服务器 ps:要保证本地文件完整&#…

测试人员一定要避免的这些不专业行为!

软件测试并非一个简单的任务&#xff0c;需要高度的专业性和责任感&#xff0c;本文将探讨一些常见的不专业行为&#xff0c;及其对软件开发过程和产品质量可能产生的负面影响。 1. 忽略细节 在测试过程中忽视细节&#xff0c;导致测试不彻底&#xff0c;漏洞未被发现。 2. …

从 Android 恢复已删除文件的 3 种简单方法

如何从 Android 恢复已删除的文件&#xff1f;毫不犹豫&#xff0c;有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是&#xff0c;如果删除的文件未同步到您的帐户或未备份怎么办&#xff1f;您错误的恢复可能会永久删除您想要的数据。因此&#xff0c;我们发布…

常见的软件架构模式

在软件开发过程中&#xff0c;软件架构模式是实现高质量、可扩展系统的关键。本文将介绍一些常见的软件架构模式&#xff0c;分析其优缺点和适用场景&#xff0c;从而帮助大家在实际项目中做出更明智的架构选择&#xff08;注意以下的架构模式相互之间并不一定互斥&#xff0c;…

23种设计模式之抽象工厂

简单工厂和工厂方法 关注 产品等级 抽象工厂 关注 产品族 对于比较稳定的产品&#xff0c;抽象工厂更有效率&#xff08;一个工厂生产很多产品族&#xff09; 抽象工厂代码例子加深理解

我与C++的爱恋:类和对象(三)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 先来回顾一下&#xff0c;上一节的内容并且通过上次的内容来做一道oj题。 https://leetcode.cn/problems/implement-queue-using-stacks/ class MyQueue { private:stack&l…

【LeetCode:216. 组合总和 III + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

JavaSE-15笔记【注解(+2024新)】

文章目录 1.注解概述2.几个常用的JDK内置的注解2.1 Deprecated2.2 Override2.3 SuppressWarnings2.4 FunctionalInterface 3.自定义注解3.1 注解也可以定义属性3.2 注解的使用规则补充 4.元注解4.1 Retention4.2 Target4.3 Documented4.4 Inherited4.5 Repeatable 5.通过反射获…

微信小程序开发

微信小程序隶属于前端&#xff0c;因此我们只需要了解掌握一些基本的功能与业务逻辑即可。 HttpClient HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

WP-AutoPostPro 汉化版: WordPress自动采集发布插件

WP-AutoPostPro 是目前最好用的WordPress自动采集发布插件&#xff0c;最大的特点是可以采集来自于任何网站的内容并自动发布到你的WordPress站点。真正做到可以采集任何网站的内容并自动发布&#xff0c;采集过程完全自动进行无需人工干预&#xff0c;并提供内容过滤、HTML标签…

libssh C++封装(一)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh&#xff0c;您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C封装。 libssh下载地址 2 设计 2.1 类图 类型说明&#xff1a; Session SSH连接…