sync、fsync 和 fdatasync 函数

Linux I/O操作fsync后数据就安全了么(fsync、fwrite、fflush、mmap、write barriers详解) 前段时间一直在研究磁盘顺序写和随机写,以及Java直接内存相关的问题,于是在各类资料或者源码中常常看到flush、mmap等概念和相关使用。然后开始各个击破,一个一个去理解其含义。终于都理清楚之后,回来总结却发现,自己越来越糊涂了。于是产生了如下疑问: 1、fsync和fwrite/fflush组合的区别是啥? 2、mmap和fsync有什么关系? 3、为什么都说fsync之后数据就不会丢失了,真的不会丢失么? 4、数据写入磁盘就安全了么? 5、为什么不能直接close文件,而需要先flush? 阅读详情

转自: 《UNIX 环境高级编程(第二版中文)》 第三章 文件I/O 3.13 sync, fsync 和 fdatasync 函数

传统的 unix 实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O 都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的 I/O 操作。这种输出方式被称为延迟写(delayed write) (Bach[1986] 第 3 章详细讨论了缓冲区高速缓存)。

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,unix 系统提供了 sync、fsync 和 fdatasync 三个函数。

#include <unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
返回值: 若成功则返回 0, 若出错则返回 -1

void sync(void);

sync 函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

通常称为 update 的系统守护进程会周期性地(一般每隔 30 秒)调用 sync 函数。这就保证了定期冲洗内核的块缓冲区。命令 sync(1) 也调用 sync 函数。

fsync 函数只对由文件描述符 filedes 指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync 可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

fdatasync 函数类似于 fsync,但它只影响文件的数据部分。而除数据外,fsync 还会同步更新文件的属性。

    本书说明的所有四种平台都支持 sync 和 fsync 函数。但是, FreeBSD 5.2.1 和 Mac OS X 10.3 并不支持 fdatasync 。

 

函数sync、fsync、fdatasync的区别,以及使用场景用例讲解 在学习sync、fsync和fdatasync这三个函数中,很多学者没有用过,不知道区别和使用场景,常常感到抽象和困惑。作为初学者,首先我们得弄清楚每个函数的作用,然后比较它们之间的不同,这样才能在实际编程中正确选择使用哪个函数。让我们先回忆一下之前学过的内容,或者查资料看看这些函数是做什么的。 阅读详情

相关推荐

避开这些坑!海天MA1600注塑机数据采集项目经验分享

本文分享了海天MA1600注塑机数据采集项目的实战经验。针对KEBA控制器接口不开放的难题,项目采用专用网关进行协议转换,并详细剖析了网络部署、ModbusTCP配置、数据准确性保障及现场运维中遇到的典型陷阱与解决方案,为同类工业物联网项目提供宝贵参考。

o4p5q6r7s的博客 492

fsync

sync, fsync, fdatasync区别

kv110的专栏 2114

【国民技术N32项目移植】基于 Windows 的 ARM GCC 开发环境

【国民技术N32项目移植】基于 Windows 的 ARM GCC 开发环境

weixin_42150032的博客 1361

函数sync、fsync、fdatasync以及fcntl

文件IO中的sync/fsync、fdatasync函数,同时简单的介绍了fcntl函数的功能

BUG_MeDe的博客 1001

Cilium动手实验室: 精通之旅---1.Getting Started with Cilium

我们需要在 HTTP 层的第 7 层实施策略,以限制允许 tiefighter 调用的确切 API,以及不允许调用哪些 API。上仅需要的 API 资源的访问,从而为微服务之间的通信实施“最低权限”安全方法。船只上进行匹配,因此我们需要在该标签上进行匹配,此外,我们必须确保来自带有标签。为了模拟我们的连接测试,我们将使用 curl 执行简单的 API 调用。在我们立即开始更改策略之前,让我们考虑一下相应的网络策略应该是什么样子。的规则,该规则将通过 L3-L4 策略对死星的访问限制为仅帝国船只。

Q先生 1126

分布式优化 (Distributed Optimization) 算法详解及案例分析

分布式优化是一种将优化问题分解为多个子问题并在多个计算节点上并行求解的方法。其目标是通过分布式计算资源高效地求解大规模优化问题。

闲人编程的博客 2709

深入理解Fsync

1 介绍 数据库系统从诞生那天开始,就面对一个很棘手的问题,fsync的性能问题。组提交(group commit)就是为了解决fsync的问题。最近,遇到一个业务反映MySQL创建分区表很慢,仔细分析了一下,发现InnoDB在创建表的时候有很多fsync——每个文件会有4个fsync的调用。当然,并不每个fsync的开销都很大。   这里引出几个问题: (1)问题1:为什么fsync...

weixin_34302798的博客 3100

剪映专业版关键帧完全教程:从原理到实战的动画必修课

关键帧是视频动画的核心原理。视频由连续静止画面(帧)构成,关键帧记录素材属性变化的起始与结束状态,中间过渡帧由软件自动计算生成。剪映专业版中,视频、音频、文本、贴纸等素材均支持关键帧动画,可调节位置、缩放、旋转、不透明度、音量等参数。操作为:在起始位置点击参数旁菱形按钮添加关键帧,移动播放头后调整参数,系统自动生成第二个关键帧。多属性可独立控制并叠加,实现放大同时淡出等复合效果。通过设定变化起点与终点,关键帧能让静止元素产生移动、缩放、淡入淡出等丰富动态,是视频剪辑从基础拼接进阶创意表达的核心技能。掌握关键

深耕计算机专业知识与技术。 2092

sync、fsync、fdatasync、fflush函数区别和使用举例

Linux/unix在内核中设有缓冲区、高速缓冲或页面高速缓冲,大多数磁盘I/O(block device)都通过缓冲进行,当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。如上所说,假设内核一直没重用该缓...

lhb0709的专栏 9805

手把手教你学Simulink——基于Simulink的无迹卡尔曼滤波(UKF)控制仿真建模示例

本文详细介绍了在Simulink中实现无迹卡尔曼滤波(UKF)控制倒立单摆系统的完整过程。通过对比扩展卡尔曼滤波(EKF),重点阐述了UKF在处理强非线性系统时的优势:采用无迹变换(UT)通过确定性采样捕捉非线性特性,精度可达三阶泰勒展开且无需计算雅可比矩阵。文章分步骤讲解了状态空间定义、UKF参数设计、Simulink实现方法,以及结合LQR控制器的闭环系统搭建,并通过仿真验证UKF在大角度偏移情况下具有更优的估计精度和控制性能。最后还讨论了工程实践要点和扩展方向,为非线性系统控制提供了实用解决方案。

MHD0815的博客 96

Python爬虫抓取淘宝商品详情页信息:从入门到高级技术应用

通过本篇博客,我们了解了如何使用Python爬虫抓取淘宝商品详情页的信息,如何使用requests和Selenium抓取静态和动态内容,如何应对淘宝的反爬虫机制,如何将抓取的数据保存到CSV文件等。随着爬虫技术的不断发展,开发者可以根据需要选择合适的工具和技术,如使用分布式爬虫框架提高抓取效率,或者利用OCR技术处理验证码等问题。在进行淘宝爬虫时,需要注意遵循相关法律法规和平台的爬虫政策,避免对平台造成过度的负担或侵犯其合法权益。

2201_76125261的博客 462

linux环境中sync函数,Linux I/O sync、fsync和fdatasync函数

同步内核缓冲区1.缓冲区简介人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经写到了文件中.但是这种概念只是宏观上的.实际上,操作系统实现某些文件I/O时(如磁盘文件),为了保证I/O的效率,在内核通常会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和高速的CPU能够协调工作避免低速的...

weixin_39935388的博客 2003

同步内核缓冲区 sync、fsync和fdatasync函数

同步内核缓冲区 转自:https://www.cnblogs.com/bhlsheji/p/5222271.html 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上。操作系统实现某些文件I/O时(如磁盘文件)。为了保证I/O的效率,在内核一般会用到一片专门的区域(内存或独立的...

sinat_AQ的博客 657

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

函数sync fsync 和 fdatasync 的区别

        一般的unix系统实现在内核中都会设有缓冲区高速缓冲或页高速缓存。当我们从磁盘读取文件时,一般都会设置一个缓冲区,先把文件内容读取到缓冲区中,然后再从该缓冲区中读取内容。把数据写入磁盘文件时也是一样,一般都会先把数据缓存到缓存区,然后由内核启动的一个进程来定时(一般是30秒)地把内容写入到磁盘中。        而在 unix 中有这三个函数影响到文件的写入操作。下面介绍这三个函数...

gochenguowei的博客 1158

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

sync、fsync和fdatasync函数区别

在大多数的unix/linux对磁盘io的写操作都是通过缓存来完成的,基本的原理如下:当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。 我们称之为延迟写,极大的减少了写磁盘的次数。 但是在没写特殊的应用中

mydear_33000的专栏 2239

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【genius_platform软件平台开发】第十六讲:sync、fsync、fdatasync和fflush函数讲解

sync、fsync、fdatasync和fflush函数讲解 一、术语解释 脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。 内存映射:内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函

随意的风的专栏 1001

同步内核缓冲区 sync,fsync和fdatasync函数

同步内核缓冲区 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上。操作系统实现某些文件I/O时(如磁盘文件)。为了保证I/O的效率,在内核一般会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和快速的CP...

as3522的博客 448

sync、fsync和fdatasync函数

<br /> <br />传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。<br />延迟写减少了磁盘读写次数,但

howard的技术之路 1493

3.13 sync、fsync和fdatasync函数

3.13 sync、fsync和fdatasync函数传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满...

ckykdwr884269的博客 137

《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数

传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写 (delayed write) 延

TODD911的专栏 3014

同步I/O sync、fsync和fdatasync函数

同步内核缓冲区 1.缓冲区简介 人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经写到了文件中.但是这种概念只是宏观上的.实际上,操作系统实现某些文件I/O时(如磁盘文件),为了保证I/O的效率,在内核通常会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和高速的CPU能够协调工

一只叫做Unix的猫 2817

第二章_文件IO : 同步内核缓冲区 sync、fsync和fdatasync函数

同步内核缓冲区 sync、fsync和fdatasync函数 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上。操作系统实现某些文件I/O时(如磁盘文件)。为了保证I/O的效率,在内核一般会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和快速的CPU可以协调工作避免低速的输入输出设备长时间占用CPU。降低系统调用,提高

matafeiyanll的博客 941

文件I/O编程之sync、fsync和fdatasync函数

传统的UNIX系统实现在内核有一个多数硬盘I/O操作通过的缓冲区。当我们向一个文件写入数据时,数据通常被内核拷贝到它的其中一个缓冲区,并排队以便在之后的某个时刻写入到磁盘中。这被称为延迟写入。(Bach[1986]的第3章深入讨论了缓冲缓存。) 内核最终把所有的延迟写入块写到磁盘中,一般在它需要为其它磁盘块重用这个缓冲区时。为了确保磁盘内容和缓冲区缓存的一致性,sync、fsync和fdat

wsclinux的专栏 1393

同步内核缓冲区sync、fsync和fdatasync函数

转载地址点击打开链接 同步内核缓冲区 1.缓冲区简介 人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经写到了文件中.但是这种概念只是宏观上的.实际上,操作系统实现某些文件I/O时(如磁盘文件),为了保证I/O的效率,在内核通常会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低

六月初曲的博客 658
上一篇: centos7 gerrit + nginx 部署
下一篇: centos7 c++17
only火车头
博客等级 码龄17年 23粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值