本文共 2185 字,大约阅读时间需要 7 分钟。
本文重点说明下面内容:
Application buff
|clib buff |page cache |disk cache#include//打开流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 #include 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);}
说明
文件IO是直接操作linux系统调用,大部分的问题都是使用文件IO带来的。
api
int open(const char *pathname, int oflag);int close(int filedes);ssize_t read(int filedes, void* buff, size_t nbytes);ssize_t write(int filedes, const void* buff, size_t nbytes);int fsync(int filedes);int fcntl(int filedes, int cmd);int ioctl(int filedes, int request);
说明
size_t wirte_file(){ if(o_DIRECT) direct_io(); else buffered_io(); if( O_SYNC ) wait_data_synced();}
上述API细节可参考《unix环境高级编程》第3章。
api
#includevoid *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
mmap在calling process的虚拟地址空间中创建一个映射,主要有以下两种常用方式:
对文件创建一个mapping,读写文件可以用读写内存替代。
匿名映射,传入的fd为-1
创建mapping后,省掉了数据从在用户态buff和内核page cache的拷贝
后续整理下linux系统文件IO流程
转载地址:http://uyuki.baihongyu.com/