首页 > 其他分享 >stdio流缓冲区

stdio流缓冲区

时间:2024-10-02 20:13:18浏览次数:8  
标签:输出 函数 stdio exit 刷新 缓冲区

文件流缓冲区

每个进程都各自维护一个文件流表,和文件描述符表类似,并且这些文件流都有自己对应的缓冲区

缓冲区的设计就是为了减少磁盘io,加快io的速度

缓冲区模式

通过setvbuf或者setbuf两个函数设置缓冲区的模式

无缓冲区

就是禁用缓冲区的意思,这种模式下,就相当于直接调用write函数,不过在调用write之前可能还要处理一些格式化输出等问题,这是和直接调用write的一个小区别

行缓冲区

当标准输出(或者输入)定向到终端时,默认采用行缓冲模式,就是接收到换行符就刷新缓冲区

块缓冲区

当缓冲区的数据达到一个块的大小时,刷新缓冲区,重定向时,默认使用块缓冲区

全缓冲区

当数据填满缓冲区时,刷新缓冲区

总结对比

特性 无缓冲区(No Buffering) 行缓冲区(Line Buffering) 块缓冲区(Block Buffering) 全缓冲区(Full Buffering)
定义 数据不经过缓冲,直接写入目标设备 每当输入一行数据时,才进行输出 数据以块为单位进行缓冲,达到块大小后输出 数据在缓冲区中,直到填满后一次性输出
刷新时机 每次写入操作都立即刷新 每当遇到换行符时刷新 当缓冲区满或达到特定块大小时刷新 缓冲区满或显式调用刷新时才输出
内存使用 无额外内存开销 较少的内存开销 预定的块大小内存开销 较大的内存开销,通常是输出的总大小
性能 频繁I/O操作,性能较低 适合逐行处理,性能适中 减少I/O操作,提高性能 适合长时间不需要输出的场景,性能较高
适用场景 实时处理要求高的场景 交互式程序或逐行输出 大数据处理或文件写入 批处理或需要大量输出的场景
实时反馈 反馈及时 逐行反馈 反馈延迟,直到块大小达到 反馈延迟,直到缓冲区满

与fork和exit之间的交互

fork函数用于创建子进程,这样的话子进程会复制一份父进程的stdio流缓冲区

exit函数在调用_exit函数前,会刷新所有stdio流缓冲区

这两个配合起来,有时候就会发现有的输出打印了两份,这是因为缓冲区没有及时刷新的原因,有以下几种办法

  • 可以设置缓冲区模式
  • 使用fflush立即刷新
  • 父进程使用exit函数在程序结束后刷新,子进程使用_exit函数退出,该函数不刷新缓冲区

所以在有多进程的情况下使用stdio流,要注意缓冲区的模式,以及何时刷新缓冲区,避免出现意外情况

标签:输出,函数,stdio,exit,刷新,缓冲区
From: https://www.cnblogs.com/dylaris/p/18445038

相关文章

  • disp_buffer_flags 枚举定义了一系列用于描述 framebuffer(帧缓冲区)特性的标志位
    disp_buffer_flags 枚举定义了一系列用于描述framebuffer(帧缓冲区)特性的标志位。这些标志位主要用于指示framebuffer的内容是如何组织的,特别是当涉及到立体视觉(3D显示)时。这些标志允许系统或应用程序知道如何正确地处理和显示framebuffer中的数据。下面是对每个标志位的具......
  • IO 缓冲区
    IO缓冲区认识首先我们要明白一些概念,用户级和内核级,可以简单的理解为,我们平时的编程就是在用户级干活,而内核级就是操作系统的地盘,当我们需要操作系统帮忙的时候,就需要调用操作系统提供的一些接口,也就是系统调用(其实就是些函数),这时候就是由用户级进入到内核级执行然后,我们还......
  • 高效修复《半条命2》启动错误:《半条命2》找不到“filesystem_stdio.dll”的解决策略
    当您遇到《半条命2》启动时提示找不到“filesystem_stdio.dll”文件的问题时,这通常意味着游戏在尝试加载必要的动态链接库(DLL)文件时失败了。以下是几种高效的解决策略,帮助您快速恢复游戏运行:1.重新安装游戏步骤说明:卸载游戏:首先,从您的计算机上完全卸载《半条命2》。这可以......
  • 派遣函数 - 缓冲区设备模拟文件读写
            我们已经明白了缓冲区方式的读写操作,下面根据这部分知识,来编写一个虚拟设备。这个设备来模拟一个文件,可以将这个设备想象成一个普通文件,可以进行读写作。另外,每次写这个文件,文件的长度会增加,可以利用GetFileSize函数(API函数)得到该文件的长度。      ......
  • Java多种方式实现 有界缓冲区下的多个生产者、消费者模型 (Semaphore、while+wait+noti
    /**@Author:SongyangJi@ProjectName:[email protected]@Description:*/classProducerThreadextendsThread{intrate;MultiProducerConsumermultiProducerConsumer;publicProducerThread(intrate,MultiProducerConsumermultiProducer......
  • 内存对齐和缓冲区溢出攻击
    一、问候语欢迎你来到我的博客!二、什么是内存对齐  计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则......
  • Git缓冲区理解:`index`,`add`和`reset`,`staged`和`unstaged`
    在git里面,有一个叫index的区域,你把东西加到那里叫add,把东西再从哪里撤回来叫reset;已经在里面的我们形容它是staged,还没有加进去的我们形容它是unstaged。其实index区就是一个纯粹的缓冲区,也叫stagingarea,是正式提交之前给我们的一个缓冲,还有犹豫的余地。因为一旦正式commit提交......
  • getchar,scanf的缓冲区输入规则
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){   //输入   charpossword[20]={0};   printf("请输入密码->");   scanf("%s",possword);   //scanf读取数据时,在空格处停止   //刷新   intch=0;   while......
  • 掌握CFML:在输出缓冲区中高效搜索字符串的技巧
    掌握CFML:在输出缓冲区中高效搜索字符串的技巧在开发过程中,特别是使用ColdFusionMarkupLanguage(CFML)进行Web开发时,处理大量数据并快速找到特定字符串是一项常见且重要的任务。为了提高程序效率,我们经常需要在输出缓冲区中搜索特定的字符串,并在必要时对其进行处理。本文将分......
  • 缓冲区的奥秘:解析数据交错的魔法6
    在计算机科学的广袤世界里,有一项看似简单却又深奥无比的技术,那就是缓冲。缓冲,像是隐藏在代码背后的魔法,它默默地改变着数据的流动,使得看似杂乱无章的操作变得井然有序。然而,它的本质并非只是简单的数据暂存,而是一种艺术,一门科学。一、理解缓存区的好处(一)直观性的理解在Java......