Linux IO——缓存区

文件I/O操作---利用标准IO和系统调用IO实现复制拷贝 利用标准IO实现拷贝功能 #include<sys/types.h> #include<stdio.h> #include<stdlib.h> #define BUF_SIZE 1024 int main(void) { char buf[BUF_SIZE]; FILE *source,*backup; if(!(source=fopen("source.dat","r"))) { printf("Error in opening file.\n"); . 阅读详情

一、标准IO的缓冲区

标准 I/O 中的缓冲区是C语言标准库为优化文件读写效率设计的内存机制,本质上就是一段由FILE结构体管理的内存空间;通过临时存储数据、批量处理,可以减少硬件IO(如磁盘、终端)的交互次数,提升程序效率。

缓冲策略:标准 I/O 中有行缓冲、全缓冲、无缓冲三种,适配不同的场景,支持手动修改:

  • 行缓冲:默认用于终端设备(如stdout、stdin),Linux系统中行缓冲的大小为1024(1KB);
  • 全缓冲:默认用于文件(如 .txt),Linux系统中全缓冲大小通常是4096(4KB);
  • 无缓冲:不使用临时内存暂存,数据直接写入硬件(如stderr);无缓冲区的大小为0;
    //求行缓存区的大小------行缓存区默认用于终端设备
    //注意:程序一开始运行并没有把数据写入缓存区中,所以没有给行缓存区分配实际内存,为0
    printf("行缓存区的大小:%ld\n",stdout->_IO_buf_end-stdout->_IO_buf_base);
    printf("hello\n");
    //运行printf("hello")后,会将数据写入行缓存区,所以内存为1024
    printf("行缓存区的大小:%ld\n",stdout->_IO_buf_end-stdout->_IO_buf_base);

    //求全缓存区内存大小------全缓存区默认文件设备
    FILE *fp=NULL;
    if(NULL == (fp=fopen("test.c","r"))){
        perror("文件打开失败");
        return -1;
    }
    printf("文件打开成功\n");
    //从文件中读取数据
    int ch=0;
    ch=fgetc(fp);
    printf("ch:%c\n",ch);
    //求全缓存区的大小
    printf("全缓存区的大小:%ld\n",fp->_IO_buf_end-fp->_IO_buf_base);
    //关闭文件
    fclose(fp);
    
    //求无缓存区的大小------无缓存:没有缓存区直接写入硬件
    printf("无缓存区的大小:%ld\n",stderr->_IO_buf_end-stderr->_IO_buf_base);

二、缓冲区刷新时机

(一)行缓冲刷新时机

  • 遇到换行符  \n  会刷新缓冲区;
  • 程序正常结束会刷新缓冲区;
  • 当文件关闭时会刷新缓冲区;
  • 在输入和输出发生切换时会刷新缓冲区;
  • 缓冲区写满(未到换行符)会刷新缓冲区;
  • 主动调用fflush函数会强制刷新缓冲区;

fflush函数:所需头文件 #include <stdio.h> ,原型:int fflush(FILE *stream);  将指定流(stream)缓冲区中尚未写入的内容,强制写入到对应的输出设备(如文件、终端等)中,成功则返回0,刷新了流缓冲区;失败则返回EOF,并将errno设置为具体的错误类型

(二)全缓冲刷新时机

注意:全缓存不会遇到换行符 \n 会刷新缓冲区。

  • 程序正常结束会刷新缓冲区;
  • 当文件关闭时会刷新缓冲区;
  • 在输入和输出发生切换时会刷新缓冲区;
  • 缓冲区写满(未到换行符)会刷新缓冲区;
  • 主动调用fflush函数会强制刷新缓冲区;

三、手动设置缓冲区

(一)sleep函数

所需头文件:#include <unistd.h>

原型:unsigned int sleep(unsigned int seconds);  用于让程序暂停执行指定的时间

参数:seconds指定程序暂停执行的秒数

返回值:成功则返回0;失败:若程序被信号中断,返回未休眠的秒数

(二)setbuf函数

所需头文件:#include <stdio.h>

原型:void setbuf(FILE *stream, char *buf);  设置指定文件流的缓冲区

参数:stream指向FILE对象的指针(需要设置缓冲区的文件流);buf 指向自定义缓冲区的指针。

全缓冲:如果 buf 指向一个大小大于0的缓冲区,那么IO操作将使用全缓冲模式;
无缓冲:如果buf为NULL,或者是大小为0,那么IO操作将变为无缓冲模式;

注意:

  • 调用 setbuf 函数应该在打开文件流之后或者是任何IO操作之前,(建议在 fopen 函数之后使用 setbuf 函数,否则如果对 NULL 自定义缓冲区会出现问题)否则可能不会生效;
  • 如果要使用自定义的缓冲区,确保缓冲区足够大,以避免缓冲区溢出;如果提供了缓冲区,其大小必须至少为 BUFSIZ 字节(通常在stdio.h中定义)。
  • 当使用自定义缓冲区时,不要在buf指向的缓冲区被释放后再进行IO操作,以免未定义行为;
    //文件设置 全缓存 (全缓存下换行符不会刷新缓存区)
    char buf_size[BUFSIZ]={0};
    setbuf(fp,buf_size);
    fputs("hello world\n",fp);
    printf("延时5s\n");
    sleep(5);
    fputs("hello world\n",fp);
    fclose(fp);

(三)setvbuf函数

所需头文件:#include <stdio.h>

原型:int setvbuf(FILE *stream, char *buf, int mode, size_t size); 控制文件流的缓冲行为,允许指定缓冲模式和缓冲区的大小;该函数必须在对stream执行任何其他操作前调用(类setbuf)。

参数:

  • stream 指向FILE对象的指针(需要设置缓冲区的文件流)。
  • buf 指向自定义缓冲区的指针,如果为NULL,函数会自动分配一个大小为 size 的缓冲区。
  • mode 缓冲模式,必须是以下之一:_IOFBF 全缓冲;_IOLBF 行缓冲;_IONBF 无缓冲 
     当mode为_IONBF时,size参数被忽略(因为无缓冲大小为0)。
  • size 缓冲区的大小(以字节为单位)

返回值:成功则返回0;失败则返回非0值

    //手动设置缓冲区
    char buf[BUFSIZ]={0};
    setvbuf(fp,buf,_IOLBF,sizeof(buf));//行缓存
    //setvbuf(fp,buf,_IOFBF,sizeof(buf));//全缓存
    fputs("hello world\n",fp);
    printf("请查看文件中内容(已刷新缓冲区)\n");
    sleep(3);
    fputs("行缓冲设置成功\n",fp);
    printf("请zaici查看文件中内容(已刷新缓冲区)\n");
    sleep(3);
    fclose(fp);

关于 Python PyQt5 界面运行时提示无法初始化Qt平台的解决方案 阅读详情

相关推荐

红外图像处理实战:用MATLAB实现时域高通滤波(THPF)去噪(附完整代码)

本文详细介绍了如何利用MATLAB实现时域高通滤波(THPF)算法进行红外图像去噪,包括核心原理、工程实现要点和完整代码示例。通过分析时间窗口选择、空域预处理优化和自适应参数调整等关键点,帮助开发者有效抑制固定图案噪声,适用于无人机载红外监测和安防监控等场景。

weixin_42783709的博客 180

Linux环境下的文件IO

本文详细介绍了标准文件IO和Linux文件IO的操作函数及其应用。标准文件IO包括全缓存和行缓存两种模式,常用的函数有fopen、fclose、fgets、fputs、fread、fwrite等,这些函数通过缓存区减少系统开销。Linux文件IO则通过系统调用如open、close、read、write等直接操作文件,没有缓存区。此外,文章还介绍了目录操作函数如opendir、readdir、closedir,以及时间函数如time、ctime、localtime。标准文件IO和Linux文件IO的主要区别

2402_83192253的博客 1052

ROS2+PYTHON VENV虚拟环境配置方法

ROS2+PYTHON VENV配置方法本篇针对的是python。

下雨夏云的博客 551

Linux性能监测:磁盘IO篇

Linux性能监测:磁盘IO篇 计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。 AD: 磁盘通常是...

weixin_34161083的博客 1094

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了将YOLOv8模型部署到Hi3516CV610开发板的全流程。内容涵盖从Ubuntu环境搭建、模型获取与验证,到关键的PyTorch模型转换为ONNX格式,并利用海思工具链量化生成板端可执行的.wk文件。最后,指导开发者编写板端C程序,完成视频流处理、NNIE推理及结果后处理,并提供了部署调试与性能优化的实用技巧。

weixin_29215815的博客 262

保姆级教程:QGC地面站Vehicle Setup全模块配置详解(从固件升级到安全设置)

本文提供QGC地面站Vehicle Setup全模块配置的保姆级教程,涵盖从固件升级到安全设置的完整流程。详细解析二次开发环境准备、传感器校准、飞行模式配置等关键步骤,帮助用户快速掌握无人机配置技巧,确保飞行安全与性能优化。

weixin_28726671的博客 377

标准IO中fflush函数的使用和文件缓冲区的概念

一、IO概述 标准IO:通过文件指针访问文件(stdin stdout stderr)-------》带缓存 文件IO:通过文件描述符访问文件(0, 1, 2)---------》支持对各种文件进行读写操作 在linux下对于管道、套接字等设备进行读写操作时候,就必须使用文件IO进行操作了,对于标准IO,它为系统的库函数,在各种平台上的使用基本上相同,便于移植。 文件指针: F...

嵌入式 1042

YOLOv10改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv10目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 2182

Linux性能监测:磁盘IO

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。 内存页 上一篇 Linux 性能监测:Memory 提到

Mrknowledge 722

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 617

SAP FICO 内部往来对账功能开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO 内部往来对账功能开发说明书(包括开发源代码、测试样例、FS)

我好像病了的博客 1217

IO进程(标准IO)

无名管道(pipe)、有名管道(fifo)、信号(signal)、共享内存(shared memory)、信号灯集(semphore set)、消息队列(message queue)综上:当我们每次要打印数据时,并不是将数据直接发送给标准输出设备,也就是并直接发送给显示器,而是将要打印的数据先存放到。的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置。:读和追加,文件不存在创建,存在追加,读文件流定位到文件开头,写文件流定位到文件末尾。如果后面还有字符则返回。

xcinop的博客 1055

蓝桥杯 stm32 PWM 测量频率

参考 数据手册:比赛 的板子 上面有两个信号发生器,如下图。通过 扭动 可变电阻 (R40, R39), 来实现 PWM 频率的改变。PA15PB4。PA15,PB4分别使用TIM2_CH1TIM3_CH1来对频率进行捕获。

wuyiyu_的博客 2929

aix系统和linux的区别_浅谈linux系统下C标准库IO缓存区和内核缓存区的区别

一、C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。用户程序调用C标准I/O库函数读写普通文件或设备,而这些库函数要通过系统调用把读写请求传给内核 ,最终由内核驱动磁盘或设备完成I/O...

weixin_35480435的博客 275

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux C语言学习 新篇章 IO进程:day1

【1】标准IO 1. 概念: 标准IO是指在C库中提供的一组专门用于输入输出的函数 2. 特点: 不仅在UNIX系统,在很多操作系统上都实现了标准I/O库 标准I/O库由ANSI C标准说明 标准I/O通过缓冲机制减少系统调用,实现更高效率 标准I/O在系统调用函数基础上构造的,它便于用户使用 标准IO默认打开了三个流:stdin、stdout、stderr 3. FILE:(文件流指针) 每个被使用的文件都在内存中开辟...

haogewudi666的博客 271

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux 性能监测:IO

http://www.vpsee.com/2009/11/linux-system-performance-monitoring-io/ 磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要

onlyForCloud的专栏 606

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux 写缓存区写入文件夹,Linux缓冲区缓存对IO写入的影响?

我在Linux服务器(内核2.6.37,16核心,32G内存)上的2个文件系统之间复制大文件(3 x 30G),而且性能下降。我怀疑缓冲区缓存的使用是否会影响I/O性能。Linux缓冲区缓存对IO写入的影响?我写了一个小C程序来复制这个问题。该程序将零字节20G直接写入SAS磁盘(/ dev/sda,无文件系统)。它也支持O_DIRECT标志。当我与O_DIRECT运行程序得到一个非常稳定和可预测...

weixin_42515841的博客 253

Linux系统监控:磁盘IO篇

引论 磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。 磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地...

weixin_30588827的博客 96

020、Linux性能监控:IO

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。 内存页 上一篇Linux 性能监测:Memor...

weixin_34037977的博客 79
上一篇: 标准IO函数——文件读写、字符(串)读写函数
下一篇: 文件IO函数
Liuqy-05
博客等级 码龄144天 1粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值