文件读写与缓存机制

news2024/9/20 10:25:56

文件读写与缓存机制

写文件:

1:stdio函数库

fopen/fwrite/fflush/fclose   File* fp

2: POSIX系统级别函数

open/write/close  fd

3:Windows系统级别函数

CreateFile/WriteFile/CloseHandle

**同步数据到磁盘:**FlushFileBuffers、fsync

使用stdio函数库操作文件,标准库会在用户空间中维护一个缓冲区(缓存)。这种缓冲机制是为了提高性能,减少系统调用的次数,因为系统调用有一定的开销。

缓冲机制的工作原理

写操作:

当使用 fwrite()fprintf() 等函数向文件写入数据时,数据首先被写入到标准库在用户空间中分配的缓冲区中。缓冲区满了之后,标准库会自动将缓冲区中的内容刷新到内核缓冲区上,并清空用户空间的缓冲区。也可以手动调用 fflush() 函数或 fclose() 函数来立即刷新缓冲区。

在这里插入图片描述

读操作:

当使用 fread()fgets() 等函数从文件读取数据时,数据会被读入到用户空间的缓冲区中。之后的读操作会从缓冲区中读取数据,直到缓冲区中的数据被读完,才会再次从内核缓冲区读取新的数据块到缓冲区中。

C标准库提供了三种类型的缓冲

全缓冲(full buffering):

对于那些能够定位(如磁盘文件)的文件,默认情况下使用全缓冲。缓冲区的大小通常较大,只有在缓冲区满时才刷新到内核缓冲区。

行缓冲(line buffering):

对于标准输入/输出(如stdin、stdout),默认使用行缓冲
当遇到换行符时,缓冲区中的内容会被刷新到内核缓冲区。

无缓冲(no buffering):

对于标准错误输出(如stderr),默认情况下不使用缓冲。
每次写入操作都会直接写入到磁盘。

实际写入磁盘

当数据被复制到内核缓冲区后,内核会根据其自身的调度策略决定何时真正将数据写入物理磁盘。内核通常会合并多个写入操作,以提高效率。此外,内核还可能延迟写入操作,直到有足够多的数据需要写入,或者直到某个特定的时间间隔过去。

强制写入磁盘

如果希望确保数据立即写入到物理磁盘上,而不是仅仅写入到内核缓冲区,需要使用特定的函数来同步内核缓冲区。在Windows中,可以使用 FlushFileBuffers() 函数来强制将内核缓冲区中的数据写入磁盘。在POSIX系统中,可以使用 fsync()fdatasync() 函数来达到同样的目的。


#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main() {
    int fd;
    const char *filename = "testfile.txt";
    const char *data = "Hello, POSIX!";
    ssize_t bytes_written;

    // 打开文件以写入模式
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    if (fd == -1) 
    {
        perror("Failed to open file");
        return 1;
    }

    // 写入数据
    bytes_written = write(fd, data, strlen(data));
    if (bytes_written != (ssize_t)strlen(data)) 
    {
        perror("Failed to write to file");
        close(fd);
        return 1;
    }

    // 强制将数据写入磁盘
    if (fsync(fd) == -1) 
    {
        perror("Failed to fsync");
        close(fd);
        return 1;
    }

    // 关闭文件
    if (close(fd) == -1) 
    {
        perror("Failed to close file");
        return 1;
    }

    return 0;
}

文件写入磁盘完整流程:

第一步: 数据首先写入到用户空间缓冲区。

第二步: 当缓冲区满或显式调用刷新函数时,数据被复制到内核缓冲区。

第三步: 要确保数据实际写入到物理磁盘,需要使用 fsync()(POSIX)或 FlushFileBuffers()(Windows)来同步内核缓冲区。

面试题

写文件时进程宕机,数据是否会丢失?

答案:

  • 使用stdio函数库,在进程宕机的时候,如果没有调用 fflush 或者 fclose 函数,那么数据丢失,如果调用了,就要看机器是否掉电,如果机器没掉电,那么数据不会丢失,如果机器掉电了,那么数据有可能丢失。

  • 使用系统级别函数库,在调用write函数后进程宕机,如果机器没掉电,因为数据已经到了内核缓冲区,此时数据不会丢失;如果机器掉电,那么数据有可能丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

永磁同步电机高性能控制算法(13)后续篇—— 基于高阶扩张状态观测器(ESO)的无模型预测控制(MFPC)

1.前言 前文已经介绍过了高阶ESO相对于传统ESO的优势。 https://zhuanlan.zhihu.com/p/703039702https://zhuanlan.zhihu.com/p/703039702 但是当时搭的ESO有点问题。把公式修正之后&#xff0c;发现前文用的改进四阶ESO无法使用。 今天来解释一下为什么改进4阶ESO无法使用…

SystemTap(stap)架构和原理介绍,以及脚本编写举例

1 SystemTap简介 SystemTap是一个诊断Linux系统性能或功能问题的开源工具。它允许开发人员和系统管理员深入研究内核甚至用户空间应用程序的行为&#xff0c;以便发现错误状态、性能问题&#xff0c;或者仅仅为了解系统是如何工作的。它使得对运行时的Linux系统进行诊断调式变…

递归算法及应用

一.简介 1.介绍 递归&#xff08;Recursion&#xff09;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法&#xff0c;其核心思想是分治策略。 在日常开发中&#xff0c;我们使用循环语句远远大于递归&#xff0c;但这不能说明递归就没有用武之地&am…

服务器(百度云)部署项目(jar包)

java项目打包成jar包&#xff1a;clean------compile------install jar包上传到服务器上 和jar包相同的文件里&#xff0c;创建Dockerfile文件。 Dockerfile文件的内容informationerasure是jar包名&#xff0c;这里可根据自己定义的名字进行更换。 Dockerfile文件内容&#x…

chrome打印dom节点不显示节点信息

正常直接console dom节点 代码改成 var parser new DOMParser(); var docDom parser.parseFromString(testHtml, text/html); console.log(docDom) let htmlHeader ref< HTMLElement | null>(null) let htmlBoby ref< HTMLElement | null>(null) htmlHeader.v…

Datawhale AI 夏令营 第五期 CV Task1

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第五期&#xff09; 以及CV里面的本次任务说明&#xff1a;Task 1 从零上手CV竞赛 链接里的教程非常详细&#xff0c;很适合小白上手&#xff0c;从报名赛事到使用服务器平台再到跑模型&#xff0c;手把手教&…

【Go语言基础】调度器模型GPM与垃圾回收器GC

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了Go语言学习的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Go语言趣学指南进行的&#xff0c;每个知识点的修正和深入主要参…

ubuntu系统在线安装下载firefox-esr流览器

1、在线firefox流览器 Firefox ESR(Extended Support Release)是火狐浏览器的长期支持版本&#xff0c;针对同一个主版本提供一年左右的安全性与稳定性支持。如果您因为火狐浏览器改版而导致有原本能用的功能变得不能使用的话(例如Firefox 64.0把RSS订阅的功能拿掉了)&#xf…

IO进程day02(文件IO)

目录 【1】什么是文件IO 1》概念 2》特点 3》操作 【2】函数接口 1》打开文件open() 思考&#xff1a;文件IO和标准IO的打开方式的对应关系 2》关闭文件 close() 3》读写文件 read write 1> 读文件 read() 2> 写文件 write() 练习&#xff1a;文件IO实现cp…

使用AWS的EC2服务如何降低成本

在现代企业中&#xff0c;云计算已经成为推动业务创新和发展的重要工具。亚马逊云服务&#xff08;AWS&#xff09;的弹性计算云&#xff08;EC2&#xff09;提供了灵活的计算能力&#xff0c;企业可以根据需求快速部署和管理应用。然而&#xff0c;如何在使用EC2服务的过程中有…

无人机之多旋翼无人机的用途

一、航拍与摄影 高清摄像&#xff1a;多旋翼无人机搭载高清摄像头&#xff0c;可以进行高空拍摄&#xff0c;获取清晰的图像和视频资料&#xff0c;广泛应用于影视制作和新闻报道。 实时传输&#xff1a;无人机可通过图像传输设备&#xff0c;实现实时画面回传&#xff0c;为…

linux常见基础命令

Linux基础命令 (下面这些命令都是最常见的命令.更复杂的会在之后的C语言学习陆续深入) 1、 pwd 功能&#xff1a; print work directory的缩写&#xff0c;显示当前目录的绝对路径 2、 cd 功能&#xff1a; change directory的缩写&#xff0c;切换目录 绝对路径&#xff1a;以…

知识改变命运 数据结构【二叉树OJ题】

1. 检查两颗树是否相同OJ链接 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(pnull&&q!null||p!null&&qnull) {return false;}if (pnull&&qnull) {return true;}if (p.val!q.val) {return false;}boolean leftisSameTree(p.…

数据库内容保密检查系统:及时发现“潜在”安全威胁

日前&#xff0c;国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业——国联易安自主研发的国联数据库内容保密检查系统V1.0通过国保局涉密检测&#xff0c;获得涉密信息系统产品检测证书。其主要具备以下主…

nginx访问控制,用户认证,https

nginx访问控制 用于location段Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开比如&#xff1a;allow 192.168.100.20 192.168.100.30;deny all;拒绝某台主机访问…

JavaEE 第18节 TCPUDP优缺点(对比)

目录 前言1、UDP(User Datagram Protocol)优点缺点 2、TCP(Transmission Control Protocol)优点缺点 3、总结 前言 基于TCP/IP协议栈&#xff0c;TCP和UDP属于传输层协议。在Java生态中也分别提供了相关套接字&#xff08;Socket&#xff09;1的API&#xff0c;方便网络编程。…

基于OpenCV+MFC的KCF测速软件

基于OpenCVMFC的KCF测速软件 引言原理介绍使用介绍&#xff08;1&#xff09;主界面&#xff08;2&#xff09;打开视频&#xff08;3&#xff09;点击KCF测速&#xff08;4&#xff09;框选待检测目标&#xff08;5&#xff09;测速结果 资源链接&#xff08;包含源码&#xf…

How do I do function calling in Azure Openai using the javascript sdk

题意&#xff1a;如何使用 JavaScript SDK 在 Azure OpenAI 中进行函数调用&#xff1f; 问题背景&#xff1a; I want to be able to call functions based on the user input, I could do this with the openai library but cant find a way to do so in the azure openai l…

uniapp中$off没写正确引发的问题~

你们好&#xff0c;我是金金金。 场景 我正在使用uniapp开发微信小程序&#xff0c;涉及到几个页面之间的事件通信&#xff0c;采用的是uniapp里面的$on和&off来达到页面之间的互相通信功能如下&#xff1a;有一个选择城市的页面&#xff0c;当选择了某个城市&#xff0c;另…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…