标准IO和文件IO解析

一. 架构图标准IO和文件IO解析_第1张图片
二. 标准IO
1. 标准IO简介

  • ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义
  • 带缓冲IO
  • 可移植性
  • 通过FILE 文件指针访问
2. 标准IO缓冲

  • 全缓存:当填满I/O才进行实际的I/O操作
  • 行缓存:当在输入和输出中遇到新行符号('\n'),进行I/O操作,例如:stdout
  • 不带缓存:标准I/O不对字符进行缓冲,例如stderr
3. 如何理解缓存类型

    要理解标准IO缓存,得理解FILE文件指针(struct _IO_FILE结构体),标准IO接口操作的是FILE文件指针,FILE文件指针定义了很多变量,包括读写缓冲区指针以及缓冲区类型标志。

    我们可以通过setvbuf函数设置缓存类型:

    int setvbuf(FILE *fp, char *buf, int mode, size_t size) 

    mode :_IOFBF 全缓存 _IOLBF 行缓存 _IONBF不带缓存

    实际上:stdout和stderr也是通过该接口进行设置,形成了不同的缓存类型。

三. 文件IO
1.文件IO简介

  • 低级磁盘I/O,遵循POSIX相关标准,任何兼容POSIX标准的操作系统上都支持文件I/O
  • 不带缓冲IO
  • 通过文件描述符访问
2.文件IO工作原理

    文件IO实现用户空间数据和内核缓冲区数据的交互,标准IO和内核的交互也是通过文件IO进行,标准IO只有满足一定的条件才进行文件IO操作。

四. 数据传输流程
1.系统掉电后,文件数据丢失?

    实际工作中,我们会遇到这样的情况,我们按照标准的方式去操作IO,结果数据丢失了,比如我们调用fflush函数。

    我们先理解一下数据传输流程,用户数据调用标准I/O(fflush,或者缓冲区自动刷新)仅仅只是进行了一次实际I/O操作(文件IO:write),只是把数据写入内核缓冲区,掉电后,内核缓冲区数据并没有写入磁盘,内核缓冲区会执行fsync操作(我们可以手动执行sync),这样才能真正的把数据写入磁盘,掉电后才不会丢失。






你可能感兴趣的:(嵌入式)