【Linux系统编程】IO标准缓冲区
00. 目录
文章目录
- 00. 目录
- 01. 缓冲区概述
- 02. 全缓冲
- 03. 行缓冲
- 04. 不带缓冲区
- 05. 附录
01. 缓冲区概述
标准I/O提供了三种类型的缓冲:
1、全缓冲:
在填满标准I/O缓冲区后才进行实际I/O操作。常规文件(如普通文本文件)通常是全缓冲的。
2、行缓冲:
当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。标准输入和标准输出对应终端设备(如屏幕)时通常是行缓冲的。
3、不带缓冲:
用户程序每次调库函数做写操作都要通过系统调用写回内核(如系统调用函数)。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。
02. 全缓冲
测试代码:
int main(int argc, char *argv[])
{FILE *fp = NULL;// 读写方式打开,文件不存在则创建fp = fopen("test.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "C++程序员\n";fwrite(str, 1, strlen(str), fp); // 往文件写内容while(1); // 程序阻塞在这里return 0;
}
运行程序发现,test.txt并没有内容。因为常规文件通常是全缓冲的,只有缓冲区满了后,才会把内容写到文件中。接下来,我们改一下上面那个例子。
测试代码:
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{FILE *fp = NULL;// 读写方式打开,文件不存在则创建fp = fopen("test.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "test\n";int i = 0;while(i <= 512){ // 缓冲区大小不确定,i的大小只是一个调试值fwrite(str, 1, strlen(str), fp); // 往文件写内容i++;}while(1); // 程序阻塞在这里return 0;
}
上面的例子是循环给文件写内容,让缓冲区有填满的可能,结果发现,文件是有内容的。实际上要想成功给文件写进内容,除了缓冲区填满,还有别的方法。
2.1 人为关闭文件,就算缓冲区没有填满,内容也会写进文件
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{FILE *fp = NULL;// 读写方式打开,文件不存在则创建fp = fopen("test.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "test ok\n";fwrite(str, 1, strlen(str), fp); // 往文件写内容fclose(fp); // 人为关闭文件,就算缓冲区没有填满,内容也会写进文件while(1); // 程序阻塞在这里return 0;
}
2.2 程序正常结束,就算缓冲区没有填满,没有关闭文件,内容也会写进文件。
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{FILE *fp = NULL;// 读写方式打开,文件不存在则创建fp = fopen("test.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "test ok\n";fwrite(str, 1, strlen(str), fp); // 往文件写内容return 0;// 程序正常结束,就算缓冲区没有填满,没有关闭文件,内容也会写进文件。
}
03. 行缓冲
#include <stdio.h>int main(int argc, char *argv[])
{printf("hello test");while(1);return 0;
}
运行这个程序,会发现 hello test并没有打印到屏幕上。因为标准输入和标准输出对应终端设备时通常是行缓冲的,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。如下:
#include <stdio.h>int main(int argc, char *argv[])
{printf("hello test\n");while(1);return 0;
}
除了遇到换行符,还有别的方法可以执行I/O操作。
3.1 缓冲区满
int main(int argc, char *argv[])
{while(1){ // 循环打印,总有缓冲区填满的可能printf("hello sunplusedu");}while(1);return 0;
}
3.2 人为刷新缓冲区
#include <stdio.h>int main(int argc, char *argv[])
{printf("hello test");fflush(stdout); // 人为刷新while(1);return 0;
}
3.3 程序正常结束
#include <stdio.h>int main(int argc, char *argv[])
{printf("hello sunplusedu");return 0;// 程序正常结束
}
04. 不带缓冲区
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{char *str = "hello test"; // 有没有\n,缓冲区有没有填满,都没关系write(1, str, strlen(str)); // 往标准输出写内容while(1);return 0;
}
Linux系统调用中的IO函数一般不带有缓冲区。
05. 附录
【Linux系统编程】IO标准缓冲区相关推荐
- Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】
linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...
- Linux系统编程之文件IO
Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...
- linux原子过程,linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- Linux系统编程25:基础IO之亲自实现一个动静态库
本文接:Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系 文章目录 A:说明 B:实现静态库 C:实现动态库 A:说明 前面说过,库其实就是头文件和和.a ...
- linux系统io编程,Linux系统编程(1) —— 文件IO
本文主要对Linux系统中文件I/O的基本操作进行说明. 在Linux系统编程中,对文件进行处理的流程,通常是: 打开文件 读写文件 关闭文件 Linux内核对每一个进程维护一个打开的文件列表, 该文 ...
- 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)
00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...
- 【Linux系统编程】Linux系统调用
00. 目录 文章目录 00. 目录 01. 系统调用概述 02. 系统调用实现 03. 系统调用和库函数的区别 04. 附录 01. 系统调用概述 系统调用顾名思义,说的是操作系统提供给用户程序调用 ...
- 【学习笔记】Linux 系统编程入门
Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...
- Linux系统编程1——系统函数
文章目录 前言 一.C标准函数与系统函数的区别 1.什么是系统调用 2.文件描述符 3.相关函数 3.1 open函数 3.2 close函数 3.3 read函数 3.4 write函数 3.5 l ...
- Linux系统编程笔记
文章目录 1.Linux系统编程 2.文件IO 2.1 文件描述符 2.2 open 2.3 perror 2.4 close 2.5 write 2.6 read 2.7 remove 2.8 系统 ...
最新文章
- python os.path.join乱码_python os.listdir()乱码解决方案
- SAP CRM调查问卷的评分和图表显示功能介绍
- Java基础提升篇:equals()与hashCode()方法详解
- hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
- gifcam使用缩小内存_Fedora 上的桌面环境内存占用测试 | Linux 中国
- Tomcat log文件
- 国内各地图API坐标系统比较与转换
- GBK转unicode码查询表的改进
- post发送请求参数注意的问题
- idea安装drl插件
- Elixir 1.7改进错误处理、日志和测试
- 兆芯笔试题(2015)找反复数最多的字母的数量以及位置
- oracle获取timestamp日期,oracle日期时间型timestamp的深入理解
- 将腾讯云的云服务器迁移至轻量云服务器Ubuntu
- rrcf算法的初步理解
- 解决mmediting运行模型报错(result, consumed) = self._buffer_decode(data, self.errors, final)编码utf-8的问题
- 使用Qt Designer制作软件的图形界面
- java调用阿里云api发送短信验证服务
- Hive正则表达式案例
- 机器学习 基本概念/术语
热门文章
- 思科pix防火墙配置实例大全
- java 删除二进制内容_二进制搜索树节点删除
- 华为代码规范_53年国内唯三,华为MindSpore论文获顶会最佳论文提名
- 根据文法画出语法树_几种常用的英语教学法误导了语法教学
- python如何创建模块教程_Python创建模块及模块导入的方法
- python安装opencv出现错误,通过pip安装opencv时出错
- 【Django】基于Django架构网站代码的目录结构---转载
- 解题:POI 2013 Triumphal arch
- python——数据类型
- 从零开始搭建系统3.2——微服务注册中心开发及部署