【Linux C | 文件I/O】文件数据的同步 | sysc、fsync 和 fdatasync 函数

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、sync、syncfs
    • ✨2.1 sync、syncfs函数介绍
    • ✨2.2 sync、syncfs函数使用例子
  • 🎄三、fsync
    • ✨3.1 fsync 函数介绍
    • ✨3.2 fsync 函数使用例子
  • 🎄四、fdatasync
    • ✨4.1 fdatasync 函数介绍
    • ✨4.2 fdatasync 函数使用例子
  • 🎄五、总结


在这里插入图片描述

🎄一、概述

为了提高性能, 操作系统会对文件的I/O操作进行缓存处理。 对于读操作, 如果要读取的内容已经存在于文件缓存中, 就直接读取文件缓存。 对于写操作, 会先将修改提交到文件缓存中, 在合适的时机或者过一段时间后, 操作系统才会将改动提交到磁盘上。
Linux提供了三个同步数据的函数:

  • 1、sync函数将所有修改过的块缓存写入磁盘,阻塞调用,等到写操作完成;
  • 2、fsync函数将文件描述符fd修改的缓存(数据和属性)写入磁盘,并且等待写磁盘操作结束才返回;
  • 3、fdatasync函数将文件描述符fd修改的数据部分写入磁盘而不同步更新文件属性,并且等待写磁盘操作结束才返回;

在这里插入图片描述

🎄二、sync、syncfs

✨2.1 sync、syncfs函数介绍

函数原型:

#include <unistd.h>
void sync(void);
int syncfs(int fd);

sync()会将对文件元数据和数据的所有缓冲修改写入底层文件系统。sync()一直都会调用成功的。

syncfs()是Linux特有的,与sync()类似,但只同步包含打开文件描述符fd引用的文件的文件系统。syncfs()成功返回0,失败返回 -1。

✨2.2 sync、syncfs函数使用例子

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
	int fd = open("./sync_test", O_RDWR | O_CREAT | O_TRUNC, 0775);
	write(fd, "this is sync test\n", strlen("this is sync test\n"));
	sync();
	syncfs(fd);
	close(fd);
	return 0;
}

在这里插入图片描述

🎄三、fsync

✨3.1 fsync 函数介绍

函数原型:

#include <unistd.h>
int fsync(int fd);
//成功返回0,失败返回 -1

fsync()将文件描述符fd引用的文件的所有修改后的核心数据(即修改后的缓冲区缓存页)传输(“刷新”)到磁盘设备(或其他永久存储设备),以便即使系统崩溃或重新启动,也可以检索到所有更改的信息。这包括写入或刷新磁盘缓存(如果存在)。该调用将被阻止,直到设备报告传输已完成。

除了刷新文件数据外,fsync()还刷新与文件相关联的元数据信息(请参阅inode(7))。

调用fsync()并不一定能确保包含该文件的目录中的条目也已到达磁盘。为此,还需要在目录的文件描述符上显式fsync()

注意: fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

✨3.2 fsync 函数使用例子

// fsync.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
	int fd = open("./fsync_test", O_RDWR | O_CREAT | O_TRUNC, 0775);
	write(fd, "this is fsync test\n", strlen("this is fsync test\n"));
	fsync(fd);
	close(fd);
	return 0;
}

在这里插入图片描述

🎄四、fdatasync

✨4.1 fdatasync 函数介绍

函数原型:

#include <unistd.h>
int fdatasync(int fd);
//成功返回0,失败返回 -1

fdatasync()类似于fsync(),但不会刷新修改后的元数据,除非需要该元数据才能正确处理后续的数据检索。例如,对st_atime或st_mtime的更改(分别为上次访问的时间和上次修改的时间;请参见inode(7))不需要刷新,因为它们不需要正确处理后续读取的数据。另一方面,对文件大小(st_size,如ftruncate(2)所做)的更改将需要元数据刷新。

fdatasync()的目的是减少不需要所有元数据都与磁盘同步的应用程序的磁盘活动。

✨4.2 fdatasync 函数使用例子

// fdatasync.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
	int fd = open("./fdatasync_test", O_RDWR | O_CREAT | O_TRUNC, 0775);
	write(fd, "this is fdatasync test\n", strlen("this is fdatasync test\n"));
	fdatasync(fd);
	close(fd);
	return 0;
}

在这里插入图片描述

🎄五、总结

本文介绍文件数据的同步的几个函数 syscsyscfsfsyncfdatasync

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电压,电流,温度采样检测原理

电流采集电路&#xff1a; 电流采样原理&#xff1a; 电压采样电路&#xff1a; 温度检测&#xff1a;通过热敏电阻实现 以上资料来源于&#xff1a;正点原子&#xff0c;仅做学习笔记使用

20231231_小米音箱接入GPT

参考资料&#xff1a; GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

2013年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

“一元复始&#xff0c;万象更新。行而不辍&#xff0c;未来可期。” 努力学习和奋斗的时光总是过得飞快&#xff0c;不知不觉&#xff0c;2024年已经悄然而至&#xff0c;今天是2024年1月1日&#xff0c;六分成长祝所有的读者朋友和孩子们新年快乐&#xff01;学习进步&#…

Django 学习教程- Django 入门案例

Django学习教程系列 Django学习教程-介绍与安装 前言 本教程是为 Django 5.0 编写的&#xff0c;它支持 Python 3.10 至以上。如果 Django 版本不匹配&#xff0c;可以参考教程 使用右下角的版本切换器来获取你的 Django 版本 &#xff0c;或将 Django 更新到最新版本。如果…

uni-app js语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

1.项目简介

本次项目建立的基础是基于Django后台admin管理功能上的二次加工以符合实际情况&#xff0c;所以需要读者对Django这个架构有一定的了解&#xff0c;具体可以查看作者的另一个专栏Django详解。 随着信息技术的迅猛发展&#xff0c;图书馆的借阅系统也在不断地进行更新和改进。传…

Element|InfiniteScroll 无限滚动组件的具体使用方法

目录 InfiniteScroll 无限滚动 基本用法 详细说明 v-infinite-scroll 指令 infinite-scroll-disabled 属性 infinite-scroll-distance 属性 总结 需求背景 &#xff1a; 项目统计管理列表页面&#xff0c;数据量过多时在 IE 浏览器上面会加载异常缓慢&#xff0c;导致刚…

「实验记录」CS144 Lab1 StreamReassembler

目录 一、Motivation二、SolutionsS1 - StreamReassembler的对外接口S2 - push_substring序列写入ByteStream 三、Result四、My Code五、Reference 一、Motivation 我们都知道 TCP 是基于字节流的传输方式&#xff0c;即 Receiver 收到的数据应该和 Sender 发送的数据是一样的…

jmeter的常用功能及在测试中的基本使用和压测实战

Jmeter基础功能 了解Jmeter的常用组件 元件&#xff1a;多个类似功能组件的容器&#xff08;类似于类&#xff09; 一&#xff1a;Test Plan&#xff08;测试计划&#xff09; 测试计划通常用来给测试的项目重命名&#xff0c;使用多线程脚本运行时还可以配置线程组运行方式…

无监督学习(下)

1.高斯混合模型(GMM) (1)简单概念 高斯混合模型是一种概率模型&#xff0c;它假定实例是由多个参数未知的高斯分布的混合生成的。从单个高斯分布生成的所有实例都形成一个集群&#xff0c;通常看起来像一个椭圆。每个集群都可以由不同的椭圆形状&#xff0c;大小&#xff0c;密…

C# 给方形图片切圆角

写在前面 在有些场景中&#xff0c;给图片加上圆角处理会让视觉效果更美观。 代码实现 /// <summary>/// 将图片处理为圆角/// </summary>/// <param name"image"></param>/// <returns></returns>private Image DrawTranspar…

C语言-环境搭建

文章目录 内容Notepad的安装gcc编译工具的配置 编写软件的安装&#xff1a;软件传送门&#xff1a;Notepad软件选择一个合适的路径&#xff0c;一键傻瓜式安装即可 编译工具gcc在windows环境下的配置&#xff1a;解压gcc编辑工具包解压出来的mingw64文件放到一个合适的磁盘路径…

探索工业智能检测,基于轻量级YOLOv8开发构建焊接缺陷检测识别系统

焊接缺陷相关的开发实践在前面的博文中已经有所涉及了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《探索工业智能检测&#xff0c;基于轻量级YOLOv5s开发构建焊接缺陷检测识别系统》 将智能模型应用和工业等领域结合起来是有不错市场前景的&#xff0c;比如&…

Java中实现百度浏览器搜索功能(windows/linux)

要在Java中实现百度浏览器搜索功能&#xff0c;你可以使用Selenium WebDriver。Selenium是一个用于自动化浏览器的工具&#xff0c;WebDriver是Selenium的一个子项目&#xff0c;它提供了一套API&#xff0c;可以直接与浏览器交互。 依赖: <dependencies><dependency…

WorkPlus:领先的IM即时通讯软件,打造高效沟通协作新时代

在当今快节奏的商业环境中&#xff0c;高效沟通和协作是企业成功的关键。而IM即时通讯软件作为实现高效沟通的利器&#xff0c;成为了现代企业不可或缺的一部分。作为一款领先的IM即时通讯软件&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;助力企业打造高效沟通…

万字长文谈自动驾驶occupancy感知

文章目录 prologuepaper listVision-based occupancy :1. [MonoScene: Monocular 3D Semantic Scene Completion [CVPR 2022]](https://arxiv.org/pdf/2112.00726.pdf)2. [Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction [CVPR 2023]](https://arxiv…

CSS2_基础学习

CSS2_基础学习 一、css基础知识二、css选择器2.0 选择器的优先级2.1 CSS基本选择器2.2 复合选择器2.2.1. 交集选择器2.2.2. 并集选择器2.2.3. 后代选择器&#xff08;加空格&#xff09;2.2.4. 子代选择器2.2.5. 兄弟选择器2.2.6. 属性选择器2.2.7. 伪类选择器2.2.8. 伪元素选择…

Spark中的数据加载与保存

Apache Spark是一个强大的分布式计算框架&#xff0c;用于处理大规模数据。在Spark中&#xff0c;数据加载与保存是数据处理流程的关键步骤之一。本文将深入探讨Spark中数据加载与保存的基本概念和常见操作&#xff0c;包括加载不同数据源、保存数据到不同格式以及性能优化等方…

【Jmeter】Jmeter基础9-BeanShell介绍

3、BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。 3.1、Jmeter中使用的BeanShell 在Jmeter中&#xff0c;除了配置元件&#xff0c;其他类型的元件中都有BeanShell。BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥…

CSS一个纯样式花里胡哨的动态渐变背景块

使用SASS或CSS纯样式花里胡哨的动态渐变背景块 鼠标放在小方块上会放大并挤压周围方块&#xff0c;背景颜色会动态改变。 效果如下 HTML结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…