欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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