linux系统IO操作
本文重点说明下面内容:
- 什么是标准IO,什么是文件IO?
- 什么是Direct IO? O_SYNC标识有什么意义?
- 各个层面的缓存如何同步?
- 还在page cache中的脏页可以读写吗?
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
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);
说明
- O_SYNC标识打开的文件,会在write系统调用时,会等待IO从底层返回;O_SYNC仅对写有意义。
- O_DIRECT标识打开的文件不经过page cache; O_DIRECT对读写都是有意义的。
- O_NONBLOCK标识打开的文件(一般是网络IO,终端设备IO) ,在不可读写时立即返回EAGAIN等错误码。
- O_SYNC, O_DIRECT有区别如下,
size_t wirte_file()
{
if(o_DIRECT)
direct_io();
else
buffered_io();
if( O_SYNC )
wait_data_synced();
}
上述API细节可参考《unix环境高级编程》第3章。
mmap
api
#include <sys/mman.h>
void *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流程
linux系统IO操作的更多相关文章
- Linux系统IO分析工具之iotstat常用参数介绍
Linux系统IO分析工具之iotstat常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.安装iostat [root@flume115 ~]# yum - ...
- Linux系统IO分析工具之iotop常用参数介绍
Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- linux文件IO操作篇 (一) 非缓冲文件
文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...
- 审计 Linux 系统的操作行为的 5 种方案对比
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 很多时候我们为了安全审计或者故障跟踪排错,可能会记录分析 ...
- python paramiko模块SSH自动登录linux系统进行操作
1). Linux系统首先要开启SSH服务:service ssh status 如果没安装的话,则要:apt-get install openssh-server service ssh resta ...
- Linux系统挂载操作mount详解
在Linux系统中,文件系统不挂载是无法使用的.挂载,即是让文件系统在操作系统中可用.在Linux中使用mount命令来挂载文件系统,有永久性挂载和临时性挂载两种挂载方式. 1. 永久性挂载: 修改配 ...
- Linux - 系统基础操作
wall # 给其它用户发消息 whereis ls # 查找命令的目录 which # 查看当前要执行的命令所在的路径 clear # 清空整个屏幕 reset # 重新初始化屏幕 cal # 显示 ...
- linux系统如何操作隐藏文件
在linux下,以点"."开头命名的文件在系统中被视为隐藏文件.因此,如果想隐藏某个文件或目录,一种简单的办法就是把文件名命名为点开头. 对于目录backcron,可以这样操作隐藏 ...
随机推荐
- Ajax 与 Django
目录 Django与AJAX orm优化查询: MTV 与 MVC模型 choices 参数 update 与 save的区别 AJAX导入: Jquery 实现AJAX ajax基本语法结构 原生J ...
- Leetcode 1262. 可被三整除的最大和
题目:给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和. 示例 1: 输入:nums = [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18( ...
- SharePoint - Another Way to Delete Site Collection
I had created a site collection. But there is a problem of web-frontend server (I did not know when ...
- GCN(Graph Convolutional Network)的简单公式推导
第一步:从前一个隐藏层到后一个隐藏层,对结点进行特征变换 第二步:对第一步进行具体实现 第三步:对邻接矩阵进行归一化(行之和为1) 邻接矩阵A的归一化,可以通过度矩阵D来实现(即通过D^-1*A来实现 ...
- .net core 使用本地包
环境:.net core 2.2 类库:.Net Standard 2.0 旧版本: 发布你自己的Nuget包 如果不想把包发布到nuget上面供别人引用,然后你有没有服务器,我们只能使用本地包 ...
- Python 3.X 练习集100题 02
企业发放的奖金根据利润提成.利润(I):低于或等于10万元时,奖金可提10%:高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万之间时,高 ...
- ReentrantReadWriteLock源码分析
代码在后面 读锁 = 共享锁 读锁写锁,公用一个Sync AQS state. 写锁是排他的,看到有人获取锁,他不会去获取,他获取了锁,别人也不会进来获取锁. 写锁的获取跟ReentarntLock一 ...
- 自定义Yaml解析器替换Properties文件
自定义Yaml解析器替换Properties文件 项目结构 案例代码 配置类SpringConfiguration @Configuration @Import(JdbcCofnig.class) @ ...
- 升级最新版Rancher 2.2.6
前言:之前采用离线方式部署好了 Rancher 2.2.4(https://www.cnblogs.com/weavepub/p/11053099.html),这次升级到最新版本 Rancher 2. ...
- redux本来是同步的为什么它能执行异步代码(chunk)实现原理是什么 中间件的实现原理是什么
我们用redux执行同步的时候,都是先发起一个dispatch(actionCreator()) 1.先在actionCreator()中生成一个action对象. 2.由dispatch方法将act ...