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. 如何仅使用HTML和JavaScript构建简单的URL缩短器
  2. 给DataGrid添加自动增长的序列号
  3. 这就是那个feature map256 256向量
  4. Spring boot程序入口
  5. 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)
  6. mysql in 保持顺序_IN条件结果顺序问题_MySQL
  7. Exploit开发系列教程-Exploitme2 (Stack cookies SEH)
  8. ImageIO 框架详细解析
  9. linux 命令行字符缩放,用Linux命令行修图——缩放、编辑、转换格式
  10. QT 5 初学1 多窗口切分-续
  11. 实习踩坑之路:一个ElasticSearchJava客户端的批量处理操作bulkIndexAsync引发的内存泄漏的血案
  12. JSP项目引入Vue.js进行项目开发(工程搭建)
  13. 英雄联盟 League of Legends for Mac(LOL美服)
  14. 【仿真】carsim、prescan、simulink联合仿真教程、笔记、操作
  15. 算王标准层的量如何计算机,算王软件常用功能技巧
  16. python中算法是什么意思_什么是算法?Python中的基础算法有几种?
  17. 计算机类sci四大水刊,官方证实:「四大水刊」之一的 ONCOTARGET 2018年起将不再被 SCI 收录,你怎么看?...
  18. 最新县及县以上行政区划代码(截止2014年10月31日)
  19. 《洞察设计模式的底层逻辑》读后感
  20. linux va start,linux下strftime(),va_start(),va_end()函数的用法

热门文章

  1. SharePoint【调试,诊错系列】-- 开发环境中不同调试对象的Attach方式
  2. [WP7开发入门]在Windows 2003,XP上安装Windows Phone 7开发工具
  3. wtl for duilib 运行良好
  4. 基于jQuery的表单验证插件:jValidate
  5. [转]实用体系结构:逻辑分层
  6. centos6.8安装php7.3,CentOS7.6源码编译安装PHP 7.3.8
  7. mysql 复制表耗时_聊一下mysql的表复制
  8. 未定义标识符 stringc/c++(20)_Python 标识符命名规则
  9. aliplayer 手机全屏控件不显示_Flutter 强大的MediaQuery控件
  10. centos 删除crontab_CentOS安装crontab及使用方法