【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 系统 ...
最新文章
- 如何仅使用HTML和JavaScript构建简单的URL缩短器
- 给DataGrid添加自动增长的序列号
- 这就是那个feature map256 256向量
- Spring boot程序入口
- 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)
- mysql in 保持顺序_IN条件结果顺序问题_MySQL
- Exploit开发系列教程-Exploitme2 (Stack cookies SEH)
- ImageIO 框架详细解析
- linux 命令行字符缩放,用Linux命令行修图——缩放、编辑、转换格式
- QT 5 初学1 多窗口切分-续
- 实习踩坑之路:一个ElasticSearchJava客户端的批量处理操作bulkIndexAsync引发的内存泄漏的血案
- JSP项目引入Vue.js进行项目开发(工程搭建)
- 英雄联盟 League of Legends for Mac(LOL美服)
- 【仿真】carsim、prescan、simulink联合仿真教程、笔记、操作
- 算王标准层的量如何计算机,算王软件常用功能技巧
- python中算法是什么意思_什么是算法?Python中的基础算法有几种?
- 计算机类sci四大水刊,官方证实:「四大水刊」之一的 ONCOTARGET 2018年起将不再被 SCI 收录,你怎么看?...
- 最新县及县以上行政区划代码(截止2014年10月31日)
- 《洞察设计模式的底层逻辑》读后感
- linux va start,linux下strftime(),va_start(),va_end()函数的用法
热门文章
- SharePoint【调试,诊错系列】-- 开发环境中不同调试对象的Attach方式
- [WP7开发入门]在Windows 2003,XP上安装Windows Phone 7开发工具
- wtl for duilib 运行良好
- 基于jQuery的表单验证插件:jValidate
- [转]实用体系结构:逻辑分层
- centos6.8安装php7.3,CentOS7.6源码编译安装PHP 7.3.8
- mysql 复制表耗时_聊一下mysql的表复制
- 未定义标识符 stringc/c++(20)_Python 标识符命名规则
- aliplayer 手机全屏控件不显示_Flutter 强大的MediaQuery控件
- centos 删除crontab_CentOS安装crontab及使用方法