linux系统文件IO
程序员文章站
2022-04-21 17:26:51
本文重点说明下面内容: 什么是标准IO,什么是文件IO? 什么是Direct IO? O_SYNC标识有什么意义? 各个层面的缓存如何同步? IO路径上的各层buff Application buff | clib buff | page cache | disk cache 标准IO 标准IO操作 ......
本文重点说明下面内容:
- 什么是标准io,什么是文件io?
- 什么是direct io?
- o_sync标识有什么意义?
- 各个层面的缓存如何同步?
io路径上的各层buff
application buff
|
clib buff
|
page cache
|
disk cache
标准io
- 标准io操作的是流(file对象)
- 标准io可以设置缓存,这个缓存是用户态buffer,一般称为clib buff
api
#include <stdio.h> //打开流 file *fopen(const char *pathname, const char *type); //关闭流 int fclose(file *fp); // 刷新流 int fflush(file *fp); // 一次读写一个字符 int fgetc(file *fp); int fputc(file *fp); // 一次读写一行 char* fgets(char* buf, int n, file* fp); int fputs(const char *str, file* fp); // 二进制读写 size_t fread(void *ptr, size_t size, size_t nobj, file *fp); size_t fwrite(const void *ptr, size_t size, size_t nobj, file *fp); // 格式化输入输出 int fprintf(file *fp, const char* format, ...); int fscanf(file *fp, const char *format, ...); // 示例 #include <stdio.h> #include <stdlib.h> int main(void){ char buf[1024]; while (fgets(buf, 1024, stdin) != null) if (fputs(buf, stdout) == eof) printf("output error"); if (ferror(stdin)) printf("input error"); exit(0); }
说明
- 调用fwrite, fputc, fputs系列函数后,数据被保存到clib buf中,依然处于用户态,如果此时应用进程crash掉,这些数据将丢失。
- 在调用fflush可将clib buf中的数据写入内核的page cache中。
- 调用fclose也会将clib buff中的数据刷新到内核,并且把clib buff中的输入数据丢弃。
从这些标准io的api可看出,标准io比文件io要简洁很多,没有各种标识,没有sync, nonblock等。
上列api具体使用细节可参考《unix环境高级编程》第5章。
文件io
文件io是直接操作linux系统调用,大部分的问题都是使用文件io带来的。
api