Linux缓冲区(无缓冲,行缓冲,全缓冲)的区别

  • 1、缓冲区的概念
    • 1.1 全缓冲区
    • 1.2、行缓冲
    • 1.3 无缓冲
    • 1.4、控制缓冲区的方式
  • 2、demo
  • 3、结果分析

1、缓冲区的概念

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区。

1.1 全缓冲区

在这种情况下,在填满I/O缓冲区后再进行实际的I/O操作。对于驻留在磁盘上的文件通常由标准I/O库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。

对应一个BUFFSIZE,只要没超过buffsize就能一直缓冲,一般在使用之前进行fflush,进行缓冲区的刷新,也就是清空缓冲区,但这里的清空的意思不是删除,只是把缓冲区的内容给逼出去。全缓冲一般是默认开启的。

1.2、行缓冲

在这种情况下,当在输入和输出遇到换行符时,标准I/O执行I/O操作。允许我们一次输出一个字符。涉及一个终端时,通常使用行缓冲。

类似"scanf()" “gets()” “puts()”
再遇到 \n 的时候进行输入或输出

1.3 无缓冲

标准I/O不对字符进行缓冲处理。例如:如果标准I/O函数fputs写15个字符到不带缓冲的流上,就会调用write的相关的函数立即写入打开的文件上。
read
write
strerr

1.4、控制缓冲区的方式

void setbuf(FILE *stream, char *buf) //buf参数必须指向一个长度为BUFSIZE的缓冲区int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
参数 含义
stream 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode 这指定了文件缓冲的模式

模式的类型如下:

模式 含义
_IOFBF 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
_IOLBF 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
_IONBF 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。

size --这是缓冲的大小,以字节为单位

2、demo

/* Example show usage of setbuf() &setvbuf() */
#include<stdio.h>
#include<error.h>
#include<string.h>
int main( int argc , char ** argv )
{int i;FILE * fp;char msg1[]="hello,wolrd\n";char msg2[] = "hello\nworld";char buf[128];//open a file and set nobuf(used setbuf).and write string to it,check it before close of flush the streamif(( fp = fopen("no_buf1.txt","w")) == NULL){perror("file open failure!");return(-1);}setbuf(fp,NULL);memset(buf,'\0',128);fwrite( msg1 , 7 , 1 , fp );printf("test setbuf(no buf)!check no_buf1.txt\n");printf("now buf data is :buf=%s\n",buf);printf("press enter to continue!\n");getchar();fclose(fp);//open a file and set nobuf(used setvbuf).and write string to it,check it before close of flush the streamif(( fp = fopen("no_buf2.txt","w")) == NULL){perror("file open failure!");return(-1);}setvbuf( fp , NULL, _IONBF , 0 );memset(buf,'\0',128);fwrite( msg1 , 7 , 1 , fp );printf("test setvbuf(no buf)!check no_buf2.txt\n");printf("now buf data is :buf=%s\n",buf);printf("press enter to continue!\n");getchar();fclose(fp);//open a file and set line buf(used setvbuf).and write string(include '\n') to it,
//
//check it before close of flush the streamif(( fp = fopen("l_buf.txt","w")) == NULL){perror("file open failure!");return(-1);}setvbuf( fp , buf , _IOLBF , sizeof(buf) );memset(buf,'\0',128);fwrite( msg2 , sizeof(msg2) , 1 , fp );printf("test setvbuf(line buf)!check l_buf.txt, because line buf ,only data before enter send to file\n");printf("now buf data is :buf=%s\n",buf);printf("press enter to continue!\n");getchar();fclose(fp);//open a file and set full buf(used setvbuf).and write string to it for 20th time (it is large than the buf)
//check it before close of flush the streamif(( fp = fopen("f_buf.txt","w")) == NULL){perror("file open failure!");return(-1);}setvbuf( fp , buf , _IOFBF , sizeof(buf) );memset(buf,'\0',128);fwrite( msg2 , sizeof(msg2) , 1 , fp );printf("test setbuf(full buf)!check f_buf.txt\n");printf("now buf data is :buf=%s\n",buf);printf("press enter to continue!\n");getchar();fclose(fp);}

3、结果分析

①、第一次是无缓冲,写进去七个字节成功。


②、第二次无缓冲,依旧写进去了


③、第三次行缓冲,应为字符串中带有“\n”,所以只写进来了\n之前的内容。但后续的字符串并且在缓冲区内


④、我们进行全缓冲的时候,发现什么都没写进去。但是字符串信心保存在缓冲区内。

Linux缓冲区(无缓冲,行缓冲,全缓冲)的区别相关推荐

  1. 数据缓冲策略 —— 无缓冲、行缓冲、全缓冲(缓冲区大小测试)

    printf打印数据时,一般会先把数据放入C缓冲区,然后再刷新到内核缓冲区,最后再写入硬件 这个过程中,数据从C缓冲区迁移到内核缓冲区的操作我们称为缓冲(也可以理解为刷新) 下面我们将介绍 缓冲策略的 ...

  2. C/C++ 的全缓冲、行缓冲和无缓冲

    1.简介 C/C++中,基于 I/O 流的操作最终会调用系统接口 read() 和 write() 完成 I/O 操作.为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O接口的调用 ...

  3. 行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍

    文章目录 1- 缓冲区介绍 (1)缓冲区以及作用 (2)缓冲区的类型 [1]行缓冲(验证) [2]全缓冲(验证) [3]无缓冲 2- 内核缓冲区与用户缓冲区 (1)用户进程和操作系统的关系 (2)用户 ...

  4. Linux系统编程21:基础IO之全缓冲和行缓冲的区别及深刻理解缓冲区及其作用

    文章目录 (1)全缓冲和行缓冲 (2)真正理解缓冲区 (1)全缓冲和行缓冲 一般来说,C库函数写入显示器属于行缓冲,也就是只要遇到一些标记,比如说'\n'就会立即刷新出去 所以上面的例子中如果不关闭1 ...

  5. C标准I/O缓冲区:全缓冲和行缓冲

    ISO C标准I/O提供了全缓冲和行缓冲 全缓冲:在进行I/O操作时,只有当I/O缓冲区被填满时,才进行真正的I/O操作.所以对于全缓冲的缓冲区可由标准I/O例程自动刷新,即当缓冲区填满时,还有一种方 ...

  6. (转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .

    某日一朋友写了一个HELLO WORLD代码,出不来结果,代码如下: #include <stdio.h> int main(int argc, char **argv){     pri ...

  7. 全缓冲、行缓冲和无缓冲

    这里的缓冲是指的是用户空间的I/O缓冲区,不是内核缓冲. 无缓冲:用户层不提供缓冲,数据流直接到内核缓冲,再到磁盘等外设上.标准错误输出(2)通常是无缓存的,因为它必须尽快输出,且是输出到具有交互式的 ...

  8. 行缓冲,全缓冲,无缓冲的详细介绍

    一.标准IO缓冲区 1.1缓冲区的类型 行缓存:和终端相关的缓冲区就是行缓存 stdin stdout 全缓存: 和文件相关的就是全缓存 fopen打开的文件 不缓存:没有缓冲区 stderr 二.缓 ...

  9. 网络缓冲 linux,一个简单的linux缓冲区利用

    一个简单的linux缓冲区利用by Netfairy - 2016-02-28 刚开始接触linux下的漏洞利用,先做个练练手.程序源码如下: #include #include #include i ...

最新文章

  1. 芯片开发语言:Verilog 在左,Chisel 在右
  2. 循环输入正整数,求其平均值
  3. 深入理解分布式技术 - 负载均衡实现之一致性哈希算法
  4. relative会脱离文档流吗_脱离华为之后,高通伸来援手,荣耀40会搭载骁龙888吗?...
  5. 多长的企业视频最受欢迎?小于60秒
  6. selenium-cookie相关的操作-0223
  7. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
  8. 【SICP练习】151 练习4.7
  9. 7-9 龟兔赛跑 (20 分)
  10. Python-标准库(常用模块)
  11. matlab 还原内部函数,matlab内部函数
  12. 酒店如何实现上网认证的呢
  13. Linux常见英文报错中文翻译
  14. Codeforces Round #643 (Div. 2)C
  15. 比亚迪“亮刀”、宁德时代“狂奔”,动力电池市场的巨头混战几时休?
  16. Scalar Evolution
  17. 容器云时代,Commvault的变与不变
  18. 微软PowerApps整合PowerBI
  19. 期末入门题库-C#实现
  20. oracle数据库测评

热门文章

  1. Camtasia Studio2023最新版喀秋莎电脑录制屏幕编辑器
  2. google网络搜索技术[z]
  3. 基于C++的vs2012,win32游戏设计——僵尸
  4. 成都“失恋博物馆”吸引游人参观
  5. java仿qq空间音乐播放_使用JS改造的简单网页音乐播放器,仿QQ空间样式
  6. 内边距、边框撑大盒子问题
  7. 推荐一款国内最好的个人知识管理、笔记软件,学习工作最好帮手
  8. OJ 1004 不存在的泳池
  9. 网卡内卸载VMware Bridge Protocol协议报错:0x8007007E
  10. uniapp 引入 uview