< Linux >缓冲区

news2024/11/14 15:28:28

在上一篇文件的重定向,通常会涉及文件描述符的操控。文件描述符1(fd 1)通常代表着标准输出(stdout),它默认是指向用户的终端或控制台。当执行文件重定向操作时,如果我们关闭文件描述符1,并打开一个新的文本文件,这个新的文本文件将会接管原本分配给文件描述符1的位置。这意味着,从此刻起,所有原本应该输出到标准输出的内容(比如通过printf函数输出的内容)将会被写入到这个新的文本文件中。

如果在这个过程中,我们使用cat命令来读取这个文本文件的内容,并尝试输出到标准输出,我们在终端上将看不到任何输出,因为标准输出已经被重定向到了文本文件。只有在关闭了重定向到文本文件的文件描述符之后,标准输出才会恢复到终端,此时通过printf函数输出的内容才会再次显示在终端上。

本文就是针对这一现象的解释。其中就涉及到缓冲区。

缓冲区的本质是什么?为什么要有缓冲区??缓冲区在哪里??

细读本文,会有新发现。

什么是缓冲区?


本质就是一块内容!

缓冲区的作用

假如你身处广东,你想给北京的朋友送一份礼物。

  • 当然你可以立刻出发(坐车、坐飞机)

在花费大半个的时间后,你终于到达你的朋友身边,将礼物交给他!

  • 在过了一年,你又想给你的朋友礼物。但是想起来上一次的经历!千辛万苦、花费大量时间和金钱

这一次,你到学校的快递站。将礼物交给快递员,没过俩天。你的礼物就被送到朋友手上!

将上述的事情抽象:

进程将数据交给缓冲区,缓冲区来统一将数据管理,并送出。

缓冲区管理的好处:

由于有了缓冲区,那么就可以积累一定量的数据,再统一发送!

提高发送的总效率。
 

缓冲区刷新的方式

由于缓冲区能够暂存数据,那么必须要有能够刷新的方式

  • 无缓冲(立即刷新)
  • 行缓冲(行满了就刷新)
  • 全缓冲(缓冲区满了就刷新)

一般策略:
强制刷新

进程结束退出时,要刷新缓冲区

一般对于显示器文件,是行缓冲

对于磁盘文件是全缓冲(写满了,在刷新)

样例

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7   fprintf(stdout,"C hellow fp\n");
  8   printf("C hellow p\n");
  9   fputs("C hellow fput\n",stdout);                                                                          
 10   const char *str="system call \n";
 11   write(1,str,strlen(str));
 12 
 13   fork();
 14   return 0;
 15 
 16 }

在上述的例子中,通过fprintf,printf,fput,这些C语言的接口,和write系统调用的接口向显示器写入5句话,之后fork创建子进程。

  1. 编译运行进程,能够按顺序得到五个字符串

当我们直接向显示器打印的时候,显示器对应的文件是行刷新,而我们的字符串每一句话后面都有\n !fork()之前内容已经全部被刷新。

     2.重定向到log.txt

系统调用在前,fprintf  fprint和fput都被调用了俩次!

分析问题

我们重定向到log.txt本质就不是往显示器文件输出了,而是往磁盘,刷新方式变味了全刷新。
 全缓冲意味着缓冲区的空间会更大于行缓冲,我们写入的简单数据,势必不能将缓冲区写满。fork执行的时候,缓冲区得不到刷新,数据依旧在缓冲区里。

对于系统调用的write只被刷新一次,说明系统调用缓冲区有所不同。

结论:
目前我们谈到的缓冲区都是C语言的缓冲区,和OS没有关系,是操作系统的!
 

fork()退出后,任意一个进程在退出的时候,就要发生写时拷贝。

write调用是直接写到OS中,没有使用C语言的缓冲区。

C语言的缓冲区在哪里!

封装在file*的结构体里

FILE* 的结构体内不仅封装了fd文件描述符,还包含buffer的缓冲区。日常中,我们使用最多的就是C/C++的缓冲区!

在使用printf和fprintf的C结口函数时,并不是调用write函数,而是把数据写入结构体里的缓冲区。

当数据积累到一定规则后,调用write函数,将C语言缓冲区的数据写入OS的缓冲区中

这就是C语言的缓冲区,充当了一个中介。

总结

缓冲区能提高调用者的效率,减少磁盘的读写次数。

缓冲区刷新的规则有全缓冲、无缓冲、行缓冲。

显示器一般是行缓存,磁盘文件是全缓冲。

我们平时说的缓冲区是C/C++的,每一个file*结构体都有一个C/C++缓冲区

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

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

相关文章

SurfaceFlinger的commit/handleTransaction分析

整体背景介绍 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;本节我们来讲解一下SurfaceFlinger主要合成工作的第一个阶段任务commit 一般SurfaceFlinger端的合成工作主要有两个 1.commit 主要就是处理app端发起的一系列transaction的事务请求&#xff0c;需要对这…

Python笔记03-判断和循环

文章目录 比较运算符if-else语句while语句for循环循环中断 比较运算符 字面量True表示真&#xff0c;字面量False表示假 if-else语句 if语句判断条件的结果一定要是布尔类型 不要忘记判断条件后的&#xff1a; 归属于if语句的代码块&#xff0c;需在前方填充4个空格缩进 age…

Python武器库开发-武器库篇之C段扫描器开发(四十三)

Python武器库开发-武器库篇之C段扫描器开发(四十三) 在我们进行渗透过程中的信息收集的步骤时&#xff0c;收集资产目标的C段也是非常重要的一部分。 C段是指互联网中的一类IP地址。IP地址是互联网上每台设备的唯一标识符。IP地址由一系列数字组成&#xff0c;通常以点分十进…

性能分析与调优: Linux 实现 CPU剖析与火焰图

目录 一、实验 1.环境 2.CPU 剖析 3.CPU火焰图 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

基于ssm的孩童收养信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本孩童收养信息管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

Python库中关于时间的常见操作

目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳&#xff1a; 将时间戳转换为日期和时间&#xff1a; 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中&#xff0c;时间处理是一个重…

ppTinyPose的C++部署(jetson)

文章目录 环境准备硬件软件修改代码编译和运行运行结果参考环境准备 硬件 Jetson AGX Orin 64GB 软件 gcc/g++ >= 5.4(推荐8.2)cmake >= 3.10.0jetpack >= 4.6.1如果需要集成Paddle Inference后端,在Paddle Inference预编译库页面根据开发环境选择对应的Jetpack C…

7.数据转换、格式化、校验

日期字符串格式的表单参数,提交后转换为 Date 类型 <!-- 解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay :<form:input path="birthDay"/>Employee 类中增加日期类型属性: //关于类型转换 private Date birthDay ;数据绑定流程原理 …

快麦ERP退货借助APPlink快速同步CRM

什么是APPlink&#xff1f; APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台&#xff0c;为业务流程提供自动化的解决方案&#xff0c;将企业内部的核心系统以及第三方应用程序和云服务等进行集成。无论是开发人员还是业务人员&#xff0c;都可以使用APPlink轻松…

Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction

一、问题描述 今天测试在测试环境做压测&#xff0c;发现了一个报错&#xff0c;来找我帮忙看&#xff0c;如下图&#xff1a; 二、问题排查 先去服务器上&#xff0c;看看死锁的日志&#xff0c;找到 mysql 的安装路径&#xff0c;使用如下命令登录 mysql mysql -h 数据库IP…

科技助力教育:数字化如何改变家校社协同育人?

近年来,随着社会的快速发展,教育的责任已不再仅局限于学校。家庭、学校和社会协同育人理念,正成为促进教育高质量发展的关键要素。 2023年初,教育部等十三部门联合印发《关于健全学校家庭社会协同育人机制的意见》,提出到“十四五”时期末,形成更加完善的由“学校积极主导、家…

山西电力市场日前价格预测【2024-01-09】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-09&#xff09;山西电力市场全天平均日前电价为314.92元/MWh。其中&#xff0c;最高日前电价为593.66元/MWh&#xff0c;预计出现在18:15。最低日前电价为54.95元/MWh&#xff0c;预计出…

树莓派3B+ /+ CSI摄像头 + FFmpeg + SRS 实现直播推流

简介&#xff1a; 手头有一个树莓派3B 和一块CSI摄像头&#xff0c;想要实现一个推拉流直播的效果。 所需材料&#xff1a;开发板&#xff08;我用的是树莓派3B&#xff09;、CIS摄像头、云服务器&#xff08;用来搭建SRS服务器&#xff09; 具体实现思路&#xff1a; 使用…

看图识熊(四)

概述 人工智能已经快要进入应用的高峰期了&#xff0c;但并不需要每个人都学习算法、建模。对于程序员来说&#xff0c;应该先从自己会的方向入手&#xff0c;学习如何应用AI来解决问题&#xff0c;开发应用。 本文将带着大家动手&#xff0c;从头做一个看图识熊的应用&#…

PyTorch数据并行(DP/DDP)浅析

一直以来都是用的单机单卡训练模型&#xff0c;虽然很多情况下已经足够了&#xff0c;但总有一些情况得上分布式训练&#xff1a; 模型大到一张卡放不下&#xff1b;单张卡batch size不敢设太大&#xff0c;训练速度慢&#xff1b;当你有好几张卡&#xff0c;不想浪费&#xf…

校园跑腿小程序(前后端已完成)可做项目,可当毕设,支持二创

此小程序为我单独在小程序上运行的结果&#xff0c;图片信息、列表信息等没有出现是因为服务器到期了&#xff0c;资源被释放了&#xff0c;无法显示。但是后端是已经实现了的&#xff0c;有兴趣的同学可以私聊我。 效果预览

软件系统设计开发规程

软件设计开发规程目的在于为需求设计、开发、实现解决方案。根据适当情况&#xff0c;解决方案、设计和实现包括单独的产品、产品组件以及产品相关的生命周期的过程&#xff0c;或者它们的组合&#xff0c;以及包括如何利用准则进行接口设计。 技术解决方案过程包括&#xff1a…

工作组,本地用户,资源共享--windows sever 2012 r2

1.建立2个用户&#xff1a;stu1,stu2&#xff0c;stu2第一次登陆必须修改密码 2.建立2个用户&#xff1a;zhangsan,lisi 3.删除stu1 4.修改zhangsan的密码为111111 5.修改lisi的名字为wangwu 6.修改wangwu的密码为222222 7.禁用王五的账号 8.建立2个组&#xff1a;class1,class…

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c…