【玩转Linux】标准io缓冲区的操作
- (꒪ꇴ꒪ ),hello我是祐言
- 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
- 快上🚘,一起学习!
- 送给读者的一句鸡汤🤔:
- 集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
一、缓冲区概念
标准I/O缓冲区是用于提高I/O性能的一种机制,它位于标准C库中,并由标准I/O函数自动管理。标准I/O库通过在内存中创建缓冲区来减少频繁的系统调用,从而提高读写操作的效率。
标准I/O库使用三种类型的缓冲区:

1. 全缓冲(Fully Buffered)
当使用全缓冲模式时,标准I/O库会在内存中创建一个较大的缓冲区(通常大小为BUFSIZ),直到缓冲区被填满或遇到换行符('\n')时才会将数据写入磁盘。全缓冲适用于文件和大量数据的I/O操作,减少了系统调用的次数,提高了效率。
2. 行缓冲(Line Buffered
行缓冲模式下,标准I/O库会在遇到换行符('\n')时将数据写入磁盘,或者当缓冲区被填满时也会进行写入。行缓冲适用于终端设备(如终端窗口),可以保证每行数据都及时输出,方便用户查看输出结果。
3. 无缓冲(Unbuffered)
无缓冲模式下,标准I/O库会立即将数据写入磁盘,不使用缓冲区。每次调用I/O函数都会导致实际的系统调用,适用于需要立即刷新数据到磁盘的场景,如实时输出错误信息。
标准I/O函数会自动选择合适的缓冲模式,但你也可以使用setvbuf函数来显式地设置缓冲模式和自定义缓冲区。
对于标准输入(stdin)、标准输出(stdout)和标准错误(stderr),它们的默认缓冲模式通常是行缓冲(对于交互式终端)或全缓冲(对于文件和重定向)。
需要注意的是,标准I/O缓冲区是由C库管理的,所以在使用标准I/O函数时,要确保及时刷新缓冲区,以免数据在缓冲区中滞留而未及时输出。可以使用fflush函数来手动刷新缓冲区,确保数据及时写入磁盘或终端。
二、SETBUF函数
setbuf函数用于设置标准I/O流的缓冲区,从而控制I/O的缓冲方式。它允许你自定义缓冲区,或者禁用缓冲。setbuf函数的原型如下:
#include <stdio.h>
void setbuf(FILE *stream, char *buffer);
参数说明:
-
stream:指向要设置缓冲区的文件流,可以是标准输入(stdin)、标准输出(stdout)、标准错误(stderr)或者其他已打开的文件流。 -
buffer:指向自定义缓冲区的指针。如果传递NULL,则表示禁用缓冲,使I/O变为无缓冲。
setbuf函数允许两种方式的缓冲:
-
全缓冲:如果
buffer指向一个大小大于0的缓冲区,那么I/O操作将使用全缓冲模式。这意味着在填满整个缓冲区或者遇到换行符('\n')时,才会进行实际的I/O操作。 -
无缓冲:如果
buffer为NULL,或者大小为0,那么I/O操作将变为无缓冲模式。这意味着每次调用输出函数(printf、putchar等)或者输入函数(scanf、getchar等),都会立即进行I/O操作,而不会在内存中缓冲数据。
在使用setbuf函数时,要注意以下几点:
-
调用
setbuf函数应该在打开文件流或者任何I/O操作之前,否则可能不会生效。 -
如果要使用自定义的缓冲区,确保缓冲区足够大,以避免缓冲区溢出。
-
如果设置为无缓冲,要注意频繁的I/O操作可能会导致性能下降,因为每次调用I/O函数都会进行实际的I/O操作,这会增加系统开销。
-
当使用自定义缓冲区时,不要在
buffer指向的缓冲区被释放或者失效后再进行I/O操作,以免导致未定义的行为。
示例:使用全缓冲模式设置标准输出(stdout)的缓冲区为一个大小为BUFSIZ(通常是1024字节)的缓冲区。
#include <stdio.h>
int main() {char buf[BUFSIZ];setbuf(stdout, buf);
printf("This will be buffered\n");fflush(stdout); // 强制刷新缓冲区,立即输出printf("This will also be buffered\n");
return 0;
}
示例:禁用标准输出(stdout)的缓冲区,使其变为无缓冲模式。
#include <stdio.h>
int main() {setbuf(stdout, NULL); // 禁用缓冲
printf("This will be immediately output\n");printf("No buffering in this case\n");
return 0;
}
三、SETVBUF函数
setvbuf函数也是用于设置标准I/O流的缓冲方式,与setbuf函数类似,但提供更灵活的缓冲控制。setvbuf函数允许你自定义缓冲区,并且可以指定缓冲类型,包括全缓冲、行缓冲和无缓冲。它的原型如下:
#include <stdio.h>
int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
参数说明:
-
stream:指向要设置缓冲区的文件流,可以是标准输入(stdin)、标准输出(stdout)、标准错误(stderr)或者其他已打开的文件流。 -
buffer:指向自定义缓冲区的指针。如果传递NULL,则会使用系统默认的缓冲区。 -
mode:指定缓冲类型,可以是以下值之一:-
_IOFBF:全缓冲模式。使用指定的缓冲区,并在填满整个缓冲区时才进行实际的I/O操作。 -
_IOLBF:行缓冲模式。使用指定的缓冲区,并在遇到换行符('\n')时才进行实际的I/O操作。 -
_IONBF:无缓冲模式。禁用缓冲,每次调用I/O函数都会立即进行实际的I/O操作。
-
-
size:指定缓冲区大小。对于全缓冲和行缓冲模式,size表示缓冲区大小;对于无缓冲模式,size被忽略,可以设置为0。
setvbuf函数的返回值是非零值表示成功,返回0表示失败。
另外在使用setvbuf函数时,可以根据需要设置不同类型的缓冲模式和缓冲区大小。对于全缓冲和行缓冲,需要确保缓冲区足够大,以避免缓冲区溢出。而对于无缓冲模式,要注意频繁的I/O操作可能会导致性能下降。
示例:使用全缓冲模式设置标准输出(stdout)的缓冲区为一个大小为BUFSIZ(通常是1024字节)的缓冲区。
#include <stdio.h>
int main() {char buf[BUFSIZ];setvbuf(stdout, buf, _IOFBF, BUFSIZ);
printf("This will be buffered\n");fflush(stdout); // 强制刷新缓冲区,立即输出printf("This will also be buffered\n");
return 0;
}
示例:使用行缓冲模式设置标准输出(stdout)的缓冲区。
#include <stdio.h>
int main() {char buf[BUFSIZ];setvbuf(stdout, buf, _IOLBF, BUFSIZ);
printf("This will be line buffered\n");printf("This will also be line buffered\n");
return 0;
}
示例:禁用标准输出(stdout)的缓冲区,使其变为无缓冲模式。
#include <stdio.h>
int main() {setvbuf(stdout, NULL, _IONBF, 0); // 禁用缓冲
printf("This will be immediately output\n");printf("No buffering in this case\n");
return 0;
}
但要注意:在某些系统上,对标准输入(stdin)和标准输出(stdout)的缓冲设置可能不会生效,因为它们是由标准库提供的,并且可能使用了系统默认的缓冲设置。所以在实际使用中,最好将setvbuf函数用于文件流而不是标准输入和标准输出。
更多C语言和Linux系统相关文章,关注专栏:
手撕C语言
玩转linux
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔~ - 🎉感谢关注🎉
相关文章:
【玩转Linux】标准io缓冲区的操作
(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…...
28.JavaWeb-Elasticsearch
1.Elasticsearch概述 Elasticsearch 是一个分布式的全文检索引擎。采用Java语言开发,基于Apache协议的开源项目,具有实时搜索,稳定,可靠,快速的特点。 1.1 全文检索引擎 分为通用搜索引擎(百度、谷歌&…...
Python Flask构建微信小程序订餐系统 (十)
🔥 编辑会员信息 🔥 编辑会员信息可以通过点击会员列表操作,也可以点击会员信息详情点击进行操作 🔥 修改编程会员信息列表布局 🔥 修改 web/templates/member/index.html 文件,添加跳转到编辑会员信息的页面 web/templates/member/set.html 🔥 创建用于会员…...
j2ee相关知识点
浏览器栏中,输入的是servlet的mapping映射,请求到servlet中去,jsp路径,会跳转到对应的页面 Servlet接口位于最顶端,GenericServlet实现了Servlet,HttpServlet继承了GenericServlet 浏览器中访问Servlet映…...
Shell脚本学习-eval内置命令
这个命令,平时接触不是很多,所以不知道是什么回事。 eval内置命令: 功能:当Shell程序执行到eval语句的时候,Shell读入参数args,并将它们组合成一个新的命令,然后执行。也就是重新运算求出参数的…...
word中将合并后的多行拆分为原先的行数
word中将已经合并的多行拆分为原先的行数,我们不用刻意去数应该是多少行, 只需将拆分的行数不断增加,word会默认最大增加到合并前的行数。...
网络知识点之-BGP协议
本文章收录至《网络》专栏,点击右上角专栏图标可访问本专栏! 边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的…...
【mac系统】mac系统调整妙控鼠标速度
当下环境: mac系统版本,其他系统应该也可以,大家可以自行试下: 鼠标 mac妙控鼠标,型号A1657 问题描述: 通过mac系统自带的鼠标速度调节按钮,调到最大后还是感觉移动速度哦过慢 问题解决&…...
AI > 语音识别开源项目列举
名称所属开发机构使用场景优缺点技术特点占有率描述CMU Sphinx卡内基梅隆大学嵌入式设备、服务器应用优点:可用于嵌入式设备和服务器应用。 缺点:准确率相对较低,适用范围有限。- 支持多种语言模型和工具。- 适用于嵌入式设备和服务器应用。中…...
golang单元测试及mock总结
文章目录 一、前言1、单测的定位2、vscode中生成单测 二、构造测试case的注意事项1、项目初始化2、构造空interface{}3、构造结构体的time.Time类型4、构造json格式的test case 三、运行单测文件1、整体运行单测文件2、运行单个单测文件报错(1)command-l…...
mysql中的‘\G’ ‘\g’ ‘;’ navicat dbeaver
省流: 在navicat、dbeaver等客户端中使用时,“\G”、“\g”、“;”都可以不需要。 “\G”、“\g”、“;”都是用来做sql的结束符用。“\g”、“;”作用完全等价。“\G”是将字段横排显示转换成纵列显示。 横排显示: id |e…...
驱动day4work
头文件 #ifndef __CKR_H__ #define __CKR_H__typedef struct {unsigned int MODER; // 00unsigned int OTYPER; // 04unsigned int OSPEEDR; // 08unsigned int PUPDR; // 0Cunsigned int IDR; // 10unsigned int ODR; // 14 } gpio_t;// GPIO口 #define PHY_GPI…...
[SQL挖掘机] - 字符串函数 - length
介绍: length函数是mysql中用于获取字符串长度的函数。它接受一个字符串作为参数,并返回该字符串的字符数量(包括空格和特殊字符)。 用法: 以下是length函数的语法: length(string)其中,string是要计算长度的字符串…...
「深度学习之优化算法」(十七)灰狼算法
1. 灰狼算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读) 灰狼算法(Grey Wolf Algorithm)是受灰狼群体捕猎行为启发而提出的算法。算法提出于2013年,仍是一个较新的算法。目前为止(2020)与之相关的论文也比较多,但多为算法的应用,应该仍有研究和改进的余…...
mysql主从复制(主-从-从)
文章目录 一、前期环境准备二、主库配置1.设置server-id值并开启binlog参数2.建立同步账户并给上权限3.查看主库状态4.锁表设置只读5.备份数据库数据 三、从库配置1.设置server-id值并开启binlog参数2.还原从主库备份数据3.设定从主库同步4.启动从库同步开关 四.测试1.在主库上…...
如何制定数据采集解决方案?
数据采集仍是人工智能(AI)构建团队的主要瓶颈。原因各不相同:用例数据可能不足,深度学习等新机器学习(ML)技术需要更多数据,或者团队并未建立获取所需数据的适当流程。但无论如何,对…...
RabbitMQ消息可靠性问题及解决
说明:在RabbitMQ消息传递过程中,有以下问题: 消息没发到交换机 消息没发到队列 MQ宕机,消息在队列中丢失 消息者接收到消息后,未能正常消费(程序报错),此时消息已在队列中移除 …...
2023河南萌新联赛第(三)场:郑州大学(两个题目)
1.入门mex 重点 一些数字的mex是从0往上枚举,第一个没出现的数字。请你回答选最多k个数字,mex最大是多少 既然从0开始枚举,那么应该是最小,那么最大是什么? 经过自己的考虑,给出一个样例,0 1 1…...
学生管理系统-07打包与上线
一、项目架构 vue的项目必须要进行打包,并部署在nginx服务器上的 二、vue的打包 1、修改vue.cofing.js文件 在该文件中添加publicPath属性,值为./ const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDepen…...
day31贪心算法 用最少数量的箭引爆气球 和无重叠区间
题目描述 题目分析: x轴向上射箭,12一支,重叠的需要一支,3-8一支,7-16一支 返回2; 就是让重叠的气球尽量在一起,局部最优;用一支弓箭,全局最优就是最少弓箭;…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
