linux文件缓冲区
Posted 小行动大智慧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件缓冲区相关的知识,希望对你有一定的参考价值。
背景
之前在linux下手写c语言日志库的时候,遇到日志内容无法及时刷新的情况,百思不得其解;最后查资料才知道是默认的缓冲区设置的问题。‘
与之相关的缓冲区设置函数有setbuf和setvbuf
分析
缓冲区分类:1.行缓冲 2.全缓冲 3.无缓冲
行缓冲特点是:
- 默认大小:1024字节;
- 遇换行符或缓冲区满时,将刷新缓冲区;
比如,标准输入输出就是行缓冲类型。
全缓冲特点是:
- 默认大小:4096字节;
- 缓冲区满时,将刷新缓冲区;
比如,普通文件读写缓冲区就是全缓冲类型。
无缓冲特点是直接调用系统IO刷新缓冲区,比如标准错误的缓冲区
磁盘文件缓冲区
通过setbuf和setvbuf函数,可以对文件缓冲区类型和大小进行修改。
测试代码
#include <stdio.h> #include <stdlib.h> int main() { int i; FILE *fp; char msg[] = "hello,world "; char buf[128]; if((fp = fopen("setbuf_nobuff.txt","w")) == NULL) { perror("file open fail"); exit(-1); } setbuf(fp,NULL); // NO_BUFF fwrite(msg,7,1,fp); printf("test setbuf(NULL) "); printf("press enter to continue "); getchar(); fclose(fp); if((fp = fopen("setvbuf_ionbf.txt","w")) == NULL) { perror("setvbuf_ionbf.txt"); exit(-1); } setvbuf(fp,NULL,_IONBF,0); fwrite(msg,7,1,fp); printf("test setvbuf(_IONBF) "); printf("press enter to continue "); getchar(); fclose(fp); if((fp = fopen("setvbuf_iolbf.txt","w")) == NULL) { perror("setvbuf_iolbf.txt"); exit(-1); } setvbuf(fp,buf,_IOLBF,sizeof(buf)); fwrite(msg,sizeof(msg),1,fp); printf("test setvbuf(_IOLBF) "); printf("press enter to continue "); getchar(); fclose(fp); if((fp = fopen("setvbuf_iofbf.txt","w")) == NULL) { perror("setvbuf_iofbf.txt"); exit(-1); } setvbuf(fp,buf,_IOFBF,sizeof(buf)); for(i = 0;i < 2;i++) { fprintf(fp, msg); } printf("test setbuf(_IOFBF) "); printf("press enter to continue "); getchar(); fclose(fp); return 0; }
以上是关于linux文件缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165320 《信息安全系统设计基础》 缓冲区溢出漏洞实验
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
如何在不下载整个片段的情况下使用媒体源缓冲区和分段 mp4 在特定时间启动视频?
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段