基础IO——缓冲区

news2024/11/20 8:25:24

文章目录

  • 1. 缓冲区理解
    • 1.1 缓冲区在哪里
    • 1.2 刷新策略
  • 2. 标准输出和标准错误
    • 2.1 模拟perror

1. 缓冲区理解

什么是缓冲区呢
缓冲区的本质:就是一段内存

为什么要有缓冲区呢
大家在日常生活中,如果我们想寄东西给朋友,我们会先到快递站去寄。如果没有快递站,我们自己去寄,那么就会耽误自己的时间。那么这个缓冲区就相当于快递站,我们就相当于进程,你的朋友就是外设。缓冲区第一个作用:为了解放使用缓冲区的进程的时间

缓冲区第二个作用:可以集中处理数据刷新,减少IO的次数,从而达到提高整机的效率的目的

1.1 缓冲区在哪里

看下面的例子:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
然后我们再看这样的:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
在这里插入图片描述

为什么会是这个现象,printf为什么一开始不显示了
我们知道:printf里面的数据没有立即打印出来,是这些数据在缓冲区里了。
但是write是立即刷新了,printf没有立即刷新。而printf里面是封装了write,所以这个缓冲区一定不在write内部,不是内核级别的。那么这个缓冲区只能是C语言提供。

我们知道:在stdout中,它是FILE*的,所以是一个结构体。它里面就封装了语言级别的缓冲区。
在这里插入图片描述
我们在使用这些C库里面的函数时,首先并不是直接调用write函数。而是先存到FILE里的缓冲区,然后当这个缓冲区满了的时候,再去调用write函数。

1.2 刷新策略

如果在刷新之前,关闭了fd会有什么问题
在这里插入图片描述
我们把stdout里的fd关上,看一下运行什么情况?
在这里插入图片描述
这个情况就说明了,我们在使用C库里面的函数时,并没有及时调用write,而是先存到缓冲区里。我们把fd关上了,write就不能使用了,所以就不会刷新出来。

既然缓冲区在FILE内部,在C语言中,每打开一次文件,就会有一个FILE*返回。那就说明,每一个文件都有一个fd和属于它自己的语言级别的缓冲区

刷新的几种常见情况
常规:
1.无缓冲(立即刷新)。
2.行缓冲(逐行刷新),一般是显示器文件。
3.全缓冲(缓冲区满,刷新),一般是块设备对应的文件,也就是磁盘文件。

特殊:
1.进程退出
2.用户强制刷新

看下面的例子:
在这里插入图片描述
在这里插入图片描述
这里第一个很好解释,write不用解释了,因为它直接刷新出来。而三个C库函数是往显示器打印,所以是行刷新,而这三个都带了\n,所以直接刷新出来了。

第二个是什么情况呢?write不用解释,直接刷新。但C库函数都打印了两次,是为什么?
因为我们重定向到了log.txt,是磁盘文件。所以是全刷新。所以这些C库函数并没有刷新,而是先保留在缓冲区里。然后fork之后,进程结束,父子进程开始刷新缓冲区。

缓冲区,是自己的FILE内部维护的,属于父进程内部的数据区域。而刷新的本质,是把缓冲区的数据write到OS内部,清空缓冲区。所以,当任意一方试图写入,便以写时拷贝的方式各自一份副本
所以会打印两次。

2. 标准输出和标准错误

在这里插入图片描述
这里C++的命名方式可以有.cpp,.cc,.cxx三种方式。

我们看一下运行结果:
在这里插入图片描述
这是为什么呢?我们知道:标准输出是1,标准错误是2。虽然它们都指向通一个硬件,但是不同的fd,所以它们互不影响。在这里,只是对1号文件符重定向,和2号没有关系。

如果我们想把二者重定向到各自文件,怎么办呢
在这里插入图片描述
那么,这样的意义是什么呢
可以区分哪些是程序日常输出,哪些是错误。方便我们去观察

如果我们就想混在一起打印呢
在这里插入图片描述
首先,重定向到新文件,说明1和3都指向了all.txt。然后2>&1的意思就是将1的内容拷贝到2,所以1,2,3,都指向了all.txt。
在这里插入图片描述
那么这个Success又是什么意思呢
C语言有一个全局变量,记录最近一次C库函数调用失败的原因。这个变量就是errno
在这里插入图片描述

2.1 模拟perror

在这里插入图片描述
运行结果如下:
在这里插入图片描述
结果和perror是一样的。

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

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

相关文章

ELK集群部署---LogStash,Filebeat的部署

1. 环境规划: 主机名IP地址角色node1192.168.56.111 ElasticSearch(master) Zookeeper Kafka node2192.168.56.112 ElasticSearch(slave) Kibana Zookeeper Kafka node3192.168.56.113 ElasticSearch(slave) Zookeeper Kafka node4192.168.56.114 Logstash Filebeat 2. nod…

vue 实现类似甘特图大屏效果

最近在做大屏展示,其中一个需求是展示生产过程中投料情况,效果类似甘特图。 思路:1.先得到整个过程的开始时间startTime和结束时间endTime。计算出整个过长经历的时长。 2.计算横向坐标的开始时间start和结束时间end,坐标的开始时…

五分钟了解GRE是什么,四信GRE相关应用推荐

随着互联网新技术的发展以及智能化水平的提高,各企业对实时数据传输的需求也在不断提升,企业愈发重视数据中心的建设,各类虚拟网络技术相继被引入。今天,我们重点了解下云端“借道”鼻祖,善于“包装”的GRE&#xff0c…

新品上市|四信LTE Cat.1无线数传终端 推进中低速蜂窝典型应用

当前,物联网作为新型信息基础设施,已成为推动制造业、零售业、金融业、服务业等行业数字转型、智能升级、融合创新的重要支撑。《“十四五”信息通信行业发展规划》提出,要推进移动物联网全面发展,推动存量2G/3G物联网业务向NB-Io…

SSM医院病历

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):

CentOS7安装git

CentOS7安装git前言一、git介绍二、使用yum安装git1.安装git2.查看git版本3.移除git三、源码包安装git1.安装依赖2.下载源码包3.解压4.git安装5.查看git版本总结前言 CentOS7安装git,刚开始使用yum安装git,发现安装的版本默认是1.8.3.1,如果…

yaml 资源配置清单使用详解——k8s声明式资源管理

目录 一、kubectl 操作 yaml 文件 1.应用yaml文件指定的资源 2.删除yaml文件指定的资源 3.查看资源的yaml格式信息 4.查看yaml文件字段说明 5.修改yaml文件指定的资源 (1)离线修改 (2)在线修改 二、编辑yaml配置清单生成…

Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?

摘要:为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,华为IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云。本文分享自华为云社区《【华为云IoTEdge开发实战】Java开发如何通过IoT边缘ModuleSDK进…

字符串函数剖析(2)

最慢的步伐不是跬步,而是徘徊;最快的脚步不是冲刺,而是坚持。——《人民日报》 字符串函数的重点: 文章不长,是为了让你一点点消化所有内容: 1.strncpy函数的脾气 1.1模拟实现strncpy函数 2.strncmp函数…

马化腾说视频号是全公司希望

我是卢松松,点点上面的头像,欢迎关注我哦! 这应该是,腾讯这家公司创办以来,马化腾最焦虑也最外露的一次讲话了,对于腾讯内部的大会,马化腾先生作了重要发言,因其在内部员工大会的讲…

边界网关协议BGP(计算机网络-网络层)

目录 因特网分层路由 分层路由和自治系统 边界网关协议 BGP BGP 的设计目标 BGP 发言人 路径向量算法 BGP 协议的要点 因特网分层路由 规模问题 路由选择算法将很难收敛 交换的路由信息会占用大量的带宽 管理问题 许多单位不愿意外界了解自己单位网络的具体细节 希望采用…

新能源汽车补贴即将取消,汽车金融的促进作用逐渐显现

中国新能源汽车产业发展强劲。自2015年起,新能源汽车销量连续7年位居世界第一。特别是2021年以来,在政策支持、技术驱动、消费者接受度提升等多重因素共同影响下,中国新能源汽车市场实现了超越式的发展。2022年1-10月,新能源汽车批…

这份京东T8级程序员整理的新版Spring Cloud手抄本,把微服务讲透了

近几年,微服务可谓是红的发紫,仿佛一时间所有系统无不以拆分为荣,以构建烟囱型应用为耻。最近,一位朋友刚好赶上公司基础服务的微服务化项目,加上之前又主动学习了不少微服务的内容,便主动请缨参与到项目里…

前端实现网站悼念【灰色效果】几行代码轻松解决

博主介绍 📢点击下列内容可跳转对应的界面,查看更多精彩内容! 🍎主页:水香木鱼 🍍专栏:CSS3 文章目录 简介:这是一篇有关【前端实现网站悼念【灰色效果】几行代码轻松搞定】的文章&…

遗传编程(Genetic Programming, GP)

1. 绪言 1.1 遗传编程概述 \quad\quad自计算机出现以来,计算机科学的一个重要目标是让计算机自动进行程序设计,即只要明确地告诉计算机要解决的问题,而不需要告诉它如何去做,遗传规划便是在该领域内的一种尝试。它采用遗传算法的…

IDEA反编译Jar包

一.安装Java Bytecode Decomplier插件 (1) File–>Settings–>Plugins ,搜索 Java Bytecode Decomplier 插件 (2) 查看安装插件的路径 File->Import Setting 注意:如果你的插件里面搜不到 Java Bytecode Decomplier,但是能搜到…

spring之Bean的生命周期

文章目录一、Bean的生命周期之五步1、准备User类2、spring配置文件3、测试类4、运行结果二、Bean的生命周期之七步1、实现BeanPostProcessor类2、配置文件3、运行结果:三、Bean的生命周期之十步1、点位12、点位23、点位3四、Bean的作用域一、Bean的生命周期之五步 …

Coinbase或在不久使用Zebec发放工资,并对Web3支付赛道发展寄予厚望

流支付协议Zebec Protocol目前已经完成了生态向BNB Chian上的迁移,目前得到了以PancakeSwap为代表的头部生态的支持。在12月20日Zebec生态在PancakeSwap官方的支持下,经过社区投票,ZBC通证上线了糖浆池,并有望继续上线Binance。而…

ELK集群部署---Kibana的部署

1. 环境规划: 主机名IP地址角色node1192.168.56.111 ElasticSearch(master) Zookeeper Kafka node2192.168.56.112 ElasticSearch(slave) Kibana Zookeeper Kafka node3192.168.56.113 ElasticSearch(slave) Zookeeper Kafka node4192.168.56.114 Logstash Filebe…

优雅数据同步--canal实现mysql同步demo

当需要两张表数据同步的时候,我们会想到几种方案? 最简单的一种方式就是触发器的方式。例如A同步到B,可以通过下面的sql来添加触发器 create trigger tri_trade_update after UPDATE on A for each row begin update B set company_id new.compan…