linux平台下的写文件刷新

c语言libc库自带的fflush和linux的sync、fsync、fdatasync,字面上都是刷新缓冲区数据到磁盘(当然,fflush还可以刷新缓冲区数据到标准输入、输出以及错误输出)。下面就分析一下上面提到的四个函数的区别。

一、c语言fflush和linux的sync、fsync、fdatasync的区别

1.接口基本不同

  • fflush是libc库中提供的函数,平台无关,只有在你使用到c语言的标准文件(FILE)操作时,才涉及fflush。
  • sync、fsync、fdatasync是系统提供的系统调,平台相关。

2.原形

  • fflush接受一个参数FILE *. fflush(FILE *);
  • sync、fsync、fdatasync的函数原型如下(fd表示文件描述符)。 sync(); fsync(int fd); fdatasync(int fd);

3.功能

  • fflush: 是把C语言FILE的缓冲区中要写入文件的内容刷到操作系统的写入缓冲区中(其实是写到内核的缓冲区,即 页高速缓存)。注意:FILE的缓冲区实际就是libc库在用户空间的栈上申请的一块内存。
  • sync、fsync、fdatasync:是把内核的缓冲区(即 页高速缓存)中要写到磁盘中的数据刷到磁盘上。 下面引用一个比较形象的流程示例: FILE缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘

二、sync、fsync、fdatasync之间的区别

传统的UNIX系统在内核中设有页高速缓存,磁盘I/O的数据一般都通过这个缓存区。(所有增加缓存的目的显然都是协调两个速度不匹配的操作或者设备,这样就会很大程度缓解慢设备对快设备的拖累。)当我们向文件写入数据时,内核通常会先将数据复制到页告诉缓存中,然后将这些缓存页的地址排入队列,晚些时候再写入磁盘。这种方式被称为延迟写

1、sync和fsync、fdatasync的区别

  • sync只是将页高速缓存中所有修改过的块的地址排入写入队列,然后返回,他并不等待实际写磁盘操作结束。
  • fsync、fdatasync只对参数fd指定的一个文件起作用,并且等到写磁盘结束才返回。 这两个系统调用一般用于数据库这样的应用程序,这种应用需要确保修改过的块立即写到磁盘上。

2、fsync和fdatasync的区别

  • fsync不仅会讲数据写入磁盘上文件的数据(data)部分,还会将要更改的文件属性也刷到磁盘上的文件元数据(inode)部分。
  • fdatasync只影响文件的数据部分。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一枝花算不算浪漫

[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.

388100
来自专栏云计算教程系列

如何重置MySQL或MariaDB Root密码

忘记密码发生在我们大多数人身上。如果您忘记或丢失了MySQL或MariaDB数据库的root密码,如果您有权访问服务器和启用了sudo用户帐户,您仍然可以获得访...

48500
来自专栏L宝宝聊IT

Mysql备份与还原——mysqldump结合binlog

MySQL 备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份。这样在 MySQL 故障后可以使用全备份...

19120
来自专栏Pythonista

Django之常用命令以及问题汇总

django-admin.py startproject project-name

18810
来自专栏Laoqi's Linux运维专列

MySQL调优

46790
来自专栏云计算相关

使用JClouds在Java中获取和发布云服务器

本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Racksp...

332100
来自专栏流柯技术学院

zabbix环境安装搭建

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix由zabbix server与可选组件zabbix a...

14430
来自专栏代码世界

MYSQL之库操作

一、系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 my...

36670
来自专栏我和PYTHON有个约会

数据库最大连接数量

在数据库操作过程中,经常会遇到一些非业务逻辑错误,这样的错误要求开发人员对于自己正在操作的硬件软件乃至网络都有一定的了解,这里说说关于数据库最大连接数量的那点事...

12120
来自专栏云计算

使用JClouds在Java中获取和发布云服务器

本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Racksp...

21990

扫码关注云+社区

领取腾讯云代金券