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

news2025/1/14 1:18:08

【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 message0
  printf("%s",message2);
  //在显示器文件中打印write message1
  fork();
  //创建子进程
}

./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 message0
  write(1,message1,strlen(message1));
   //在显示器文件中write message1
  printf("%s",message2);
  //在显示器文件中打印write message1
  fork();
  //创建子进程
}

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

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

在这里插入图片描述
这里我们能发现这里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.coloradmin.cn/o/1623475.html

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

相关文章

2739. 总行驶距离

思路 模拟一下即可&#xff0c;每次让 mainTank 减去 5 &#xff0c;然后如果 additionalTank 大于 0&#xff0c;就在让 mainTank 加 1&#xff0c;最后让 additionalTank 减 1。当不满足 mainTank - 5 > 0 && additionalTank > 0 时即退出。 class Solution { …

vue3.0项目中运用vant的以及移动端的适配

文章目录 概要移动端的适配vant的引入开发以及打包过程中遇到的问题 概要 在Vue-Vben-Admin项目中运用vant-ui实现部分页面支持手机端h5页面的预览 移动端的适配 适配的原理 自适应 根据不同的设备的屏幕大小来自动调整尺寸&#xff0c;大小响应式 会随着屏幕的变动而自动调整…

文末送资料|跟着开源学技术-ChatGPT开源项目-chatgpt-java

目录 功能特性 最简使用 进阶使用 函数调用&#xff08;Function Call&#xff09; 流式使用 流式配合Spring SseEmitter使用 多KEY自动轮询 大家好&#xff0c;我是充电君 今天带着大家来看个Java版本的ChatGPT。这个开源项目就是chatgpt-java。 Github&#xff1a; h…

gitcode 上传文件报错文件太大has exceeded the upper limited size

报错 remote: Start Git Hooks Checking Error: Deny by project hooks setting ‘default’ has exceeded the upper limited size (10 MB) in commit 当前有效的解决方案 项目设置->提交设置->勾选管理员不受规则限制->提交 重新push&#xff0c;提交成功

计算机提示dll文件缺失如何恢复?多种方法快速一键修复dll问题

动态链接库&#xff08;DLL&#xff09;是Windows操作系统中不可或缺的一部分&#xff0c;它们封装了大量的函数、类和资源&#xff0c;供多个应用程序共享使用&#xff0c;以实现功能复用、节省内存和简化软件部署。然而&#xff0c;在日常使用或软件开发过程中&#xff0c;我…

pycharm爬虫模块(scrapy)基础使用

今天学了个爬虫。在此记录 目录 一.通过scrapy在命令行创建爬虫项目 二.判断数据为静态还是动态 三.pycharm中的设置 三:爬虫主体 四.pipelines配置&#xff08;保存数据的&#xff09; 五.最终结果 一.通过scrapy在命令行创建爬虫项目 1.首先需要在cmd中进入到python文…

MySQL——运维

日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 查看日志位置&#xff1a; sho…

招商画册不会制作?这个教程收藏好

在制作招商画册过程中可能对于一些小型企业或刚刚起步的企业来说&#xff0c;招商画册的制作也不是一个难以克服的难题。本文将为您提供一些制作招商画册的技巧和建议。在制作招商画册前肯定是需要选择一款合适的在线制作工具&#xff0c;如FLBOOK 这个平台本就有海量的模板和设…

【Git教程】(十六)基于构建服务器的工作 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 基于构建服务器的工作 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备构建服务器3.2 构建服务器上的 Git3.3 比对本地开发版本与最后成功构建版本之间的差异3.4 基于构建历史的排错 4️⃣ 替代解决方案4.1 使用标签4.2 将构建历史放在中央版本库中 许多项目…

设计模式(六):原型模式

设计模式&#xff08;六&#xff09;&#xff1a;原型模式 1. 原型模式的介绍2. 原型模式的类图3. 原型模式的实现3.1 创建一个原型接口3.2 创建具体原型3.3 创建一个数据缓存类3.4 测试 1. 原型模式的介绍 原型模式&#xff08;Prototype Pattern&#xff09;属于创建型模式&…

ctfshow web29-web40

命令执行 看清都过滤了些什么&#xff01;&#xff01; 知识点&#xff1a; web34&#xff1a;当;和()被过滤了就用语言结构&#xff0c;一般有echo print isset unset include require web37&#xff1a;data协议是将后面的字符串当成php代码执行&#xff0c;例如 /?cdat…

LabVIEW学习记录2 - MySQL数据库连接与操作

LabVIEW学习记录2 - MySQL数据库连接与操作 一、前期准备1.1 windows下安装MySQL的ODBC驱动 二、LabVIEW创建MySQL 的UDL文件三、LabVIEW使用UDL文件进行MySQL数据库操作3.1 建立与数据库的连接&#xff1a;DB Tools Open Connection.vi3.2 断开与数据库的连接&#xff1a;DB T…

如何通过ABAP将数据写回BPC模型

今天给大家安利一个标准方法&#xff0c;主要用于回写BPC模型数据&#xff0c;一般情况下&#xff0c;BPC模型数据的回写&#xff0c;标准的方式有数据抽取&#xff0c;直接抽取供数模型的数&#xff0c;利用BW标准转换方式进行供数&#xff0c;又或者通过逻辑脚本BADI的方式直…

【数据结构】哈希桶

目录 前言&#xff1a; 开散列&#xff08;哈希桶&#xff09; 开散列的概念 哈希桶的模拟实现 整体框架 查找 插入 删除 析构函数 前言&#xff1a; 闭散列线性探测缺点&#xff1a;一旦发生哈希冲突&#xff0c;所有的产生哈希冲突的数据连续存储在一块区域&#xff…

【Github】sync fork后,意外关闭之前提交分支的pr申请 + 找回被关闭的pr请求分支中的文件

【Github】sync fork后&#xff0c;意外关闭之前提交分支的pr申请 找回被关闭的pr请求分支中的文件 写在最前面原因解析提交pr&#xff0c;pr是什么&#xff1f;rebase 或者 merge 命令 找到分支中被删除的文件找到被关闭的提交请求pr方法1&#xff1a;在公共仓库被关闭的pr中…

NXP i.MX8系列平台开发讲解 - 3.9 Linux PCIe协议相关介绍(二)

目录 1. PCIe 传输层协议 2. TLP介绍 2.1 TLP包格式 2.2 TLP包的种类 2.3 TLP 包传输例子 2.4 TLP 路由规则 根据上一章的知识&#xff0c;对于PCIe的发展和基础知识有了大概了解&#xff0c;本章节将会讲解PCIe的一些工作原理&#xff0c;使用的协议&#xff0c;通信交互…

ubuntu 复制文件路径

前言 我打算搞一个ubuntu右键复制文件路径的插件&#xff0c;但是找不到&#xff0c;只能平替 这个配置&#xff0c;可以把文件拖拽到cmd窗口&#xff0c;然后就直接cmd输出文件路径 配置 cd ~ vim .bashrc 在文件结尾添加 cdd () { ddirname "$1"; echo …

【C++初阶】第八站:string类的模拟实现

目录 string类的模拟实现 经典的string类问题 浅拷贝 深拷贝 写时拷贝(了解) 构造函数 string的全缺省的构造函数&#xff1a; string的拷贝构造函数 传统写法 现代写法 string的赋值重载函数 传统写法 现代写法 string的无参构造函数&#xff1a; 遍历函数 op…

ASP.NET Core 3 高级编程(第8版) 学习笔记 03

本篇介绍原书的第 18 章&#xff0c;为 19 章 Restful Service 编写基础代码。本章实现了如下内容&#xff1a; 1&#xff09;使用 Entity Framework Core 操作 Sql Server 数据库 2&#xff09;Entity Framework Core 数据库迁移和使用种子数据的方法 3&#xff09;使用中间件…

【黑马头条】-day11热点文章实时计算-kafka-kafkaStream-Redis

文章目录 今日内容1 实时流式计算1.1 应用场景1.2 技术方案选型 2 Kafka Stream2.1 概述2.2 KafkaStream2.3 入门demo2.3.1 需求分析2.3.2 实现2.3.2.1 添加依赖2.3.2.2 创建快速启动&#xff0c;生成kafka流2.3.2.3 修改生产者2.3.2.4 修改消费者2.3.2.5 测试 2.4 SpringBoot集…