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,可以这样操作隐藏 ...
随机推荐
- pyinstaller 如何引入Pycharm项目中的第三方库
使用Pycharm作为IDE的项目,引用的第三方库一般放在项目所在目录的venv\Lib\site-packages下,因此可使用以下语句引入第三方库 pyinstaller -p venv\Lib\ ...
- git: hook 修改提交信息
git获取数字顺序版本号 因为git的版本使用的是hash值,不能很直观的看出那个版本,所以想找到一种方法,获取顺序的版本号,在网上找到了方法,可以获取顺序版本号 摘自:[使用bash从SVN和Git ...
- CF1215E Marbles
CF1215E Marbles 传送门 思路 一道比较有意思的状压dp. 首先有一个结论,把一个序列通过交换相邻元素排序,那么交换次数的最小值就是逆序对个数. 证明:从小到大依次把元素换到最前面,那么 ...
- 【Gamma】事后分析
目录 [Gamma]事后分析 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 照片 [Gamma]事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清 ...
- Gamma阶段第六次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- 1-5docker私有镜像仓库
1.简单操作 1.在 https://cloud.docker.com 免费注册一个 Docker 账号 2.登录 docker login #命令登录 Docker Hub. 3.注销 docker ...
- 关于深度学习框架 TensorFlow、Theano 和 Keras
[TensorFlow] ——( https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/) 1.TensorFlow是啥 ...
- cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令。
cmder使用简介 Cmder is a software package created out of pure frustration over the absence of nice conso ...
- [原创]K8域控植入脚本生成器(内网渗透/RPC不可用解决方案)
0x001 简介 当IPC或WMI无法访问域内机器时,可通过脚本上控. 我们可以在个人机的开机注销重启脚本里配置持久化. 域环境下同样也有开机脚本,但得在在域控机器配置 可以使用BAT\VBS等脚本, ...
- 将Javabean转化JSONObject为对象
JSONObject.parseObject(JSONObject.toJSON(obj).toString()):