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标准缓冲区相关推荐

  1. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  2. Linux系统编程之文件IO

    Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...

  3. linux原子过程,linux系统编程:IO读写过程的原子性操作实验

    所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...

  4. Linux系统编程25:基础IO之亲自实现一个动静态库

    本文接:Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系 文章目录 A:说明 B:实现静态库 C:实现动态库 A:说明 前面说过,库其实就是头文件和和.a ...

  5. linux系统io编程,Linux系统编程(1) —— 文件IO

    本文主要对Linux系统中文件I/O的基本操作进行说明. 在Linux系统编程中,对文件进行处理的流程,通常是: 打开文件 读写文件 关闭文件 Linux内核对每一个进程维护一个打开的文件列表, 该文 ...

  6. 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)

    00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...

  7. 【Linux系统编程】Linux系统调用

    00. 目录 文章目录 00. 目录 01. 系统调用概述 02. 系统调用实现 03. 系统调用和库函数的区别 04. 附录 01. 系统调用概述 系统调用顾名思义,说的是操作系统提供给用户程序调用 ...

  8. 【学习笔记】Linux 系统编程入门

    Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...

  9. Linux系统编程1——系统函数

    文章目录 前言 一.C标准函数与系统函数的区别 1.什么是系统调用 2.文件描述符 3.相关函数 3.1 open函数 3.2 close函数 3.3 read函数 3.4 write函数 3.5 l ...

  10. 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 系统 ...

最新文章

  1. python os.path.join乱码_python os.listdir()乱码解决方案
  2. SAP CRM调查问卷的评分和图表显示功能介绍
  3. Java基础提升篇:equals()与hashCode()方法详解
  4. hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
  5. gifcam使用缩小内存_Fedora 上的桌面环境内存占用测试 | Linux 中国
  6. Tomcat log文件
  7. 国内各地图API坐标系统比较与转换
  8. GBK转unicode码查询表的改进
  9. post发送请求参数注意的问题
  10. idea安装drl插件
  11. Elixir 1.7改进错误处理、日志和测试
  12. 兆芯笔试题(2015)找反复数最多的字母的数量以及位置
  13. oracle获取timestamp日期,oracle日期时间型timestamp的深入理解
  14. 将腾讯云的云服务器迁移至轻量云服务器Ubuntu
  15. rrcf算法的初步理解
  16. 解决mmediting运行模型报错(result, consumed) = self._buffer_decode(data, self.errors, final)编码utf-8的问题
  17. 使用Qt Designer制作软件的图形界面
  18. java调用阿里云api发送短信验证服务
  19. Hive正则表达式案例
  20. 机器学习 基本概念/术语

热门文章

  1. 思科pix防火墙配置实例大全
  2. java 删除二进制内容_二进制搜索树节点删除
  3. 华为代码规范_53年国内唯三,华为MindSpore论文获顶会最佳论文提名
  4. 根据文法画出语法树_几种常用的英语教学法误导了语法教学
  5. python如何创建模块教程_Python创建模块及模块导入的方法
  6. python安装opencv出现错误,通过pip安装opencv时出错
  7. 【Django】基于Django架构网站代码的目录结构---转载
  8. 解题:POI 2013 Triumphal arch
  9. python——数据类型
  10. 从零开始搭建系统3.2——微服务注册中心开发及部署