fopen/fwrite/fread/open/write/read的区别

news/2024/5/17 16:26:36

fopen和Open,read和fread,write和fwrite有什么区别,很多人都会弄混了,而这经常会带来一些问题。所以在这里理清他们的关系是很有必要的。

open/read/write是Linux提供的系统调用,用户态的程序只能通过这些接口来访问文件系统层。而fopen/fread/fwrite是C库提供的文件读写接口,其核心实现是基于open/read/write这一类的系统调用。说到这有些人可能会说,那我再写代码的时候应该用哪一套?其实都是可以的,主要看你的需求,C库函数的目的是为了方便编程,所以C库的文件接口挺了一些额外的处理,例如字符串和文本的处理,比如fputs和fgets,所以如果你在做文本数据的输入输出,无疑C库会是更好的选择。

Note:绝大部分的C库都为文件接口提供一层缓存,所以你调用fwrite操作的时候,实际上数据是先放到这一层缓存的,在编程的时候必须注意。

Linux数据回写

这一部分是问的最多的问题,很多对刚接触文件接口(包括前面的系统调用和C库函数)的人都会觉得很奇怪:为什么我fwrite/write函数已经返回了,此时掉电或重启后数据回丢失?问题的根源在于缓存的存在,由于存储设备属于低速设备,直接操作的话会有严重的延迟,所以通常会在DRAM上先缓存一部分数据。而DRAM是易失性存储设备,掉电数据就丢了,所以要确保数据固化就要把数据会写到存储设备上。

数据回写有两种方式:1,主动同步回写;2,异步后台回写;在了解数据如何回写前,有一点必须要要注意,你的缓存有可能有好多层,所以你必须从上到下把每一层的缓存都刷出去(即写到下一层)。这一点我们下面会举几个具体的例子,先介绍怎么主动同步回写。

先看一个系统调用的例子:

write只是把数据提交到内核的Page Cache(假设没有启用DIO),要想写到存储设备,必须通过fdatasync或fsync系统调用。下面看一些修正后的代码:

看完系统调用的例子,再来看一下C库的例子:

我们知道C库也有一层文件缓存,所以掉电是因为数据还在这一层缓存中,熟悉C库的同学可能知道这里要加一个fflush,其实并不对,fflush只能保证把缓存回写到下一层,即内核的Page Cache,依然需要调用fsync再刷到物理存储设备。正确的写法如下:


http://www.mrgr.cn/p/27734663

相关文章

实验二:需求分析

一、实验题目 :需求分析 **二、实验目的 ** 1、掌握StarUML软件的安装; 2、掌握利用StarUML工具分析、设计、绘制用例图; 3、掌握利用StarUML工具分析、设计、绘制类图; 4、掌握利用StarUML工具分析、设计、绘制状态图; 5、掌握利用StarUML工具分析、设计、绘制顺序图。 6…

【智能算法】鸡群优化算法(CSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2014年,X Meng等人受到鸡群社会行为启发,提出了鸡群优化算法(Chicken Swarm Optimization, CSO)。 2.算法原理 2.1算法思想 CSO算法的思想是基于对…

硬件设备杂记——12G SDI及 AES67/EBU

常见的 SDI线缆规格,HD-SDI又被称为1.5G-SDI,具体参数以秋叶原的参数为例 AES67/EBU 目前音频网络标准主要集中在OSI网络体系的第二层和第三层。 第二层音频标准的弊端在于构建音频网络时需要专用的交换机,无法利用现有的以太网络&#xff0c…

【切记】AI 就是实验科学

像生物学家而不是一数学家一样工作写短脚本而不是长程序 可视化一切 明白新发现通常发生在你做其他事情的时候 让你自己很幸运杂志照片实验 [Hubel and Weasel, 1964] (注:猫的视觉皮层逐层识别形状,奠定了卷积神经网络的生物学基础)

开放式耳机应该买什么样的?五大拔尖宝藏产品,放心闭眼入!

科技的日新月异使得蓝牙耳机已然成为我们日常生活中不可或缺的一部分。而在这一潮流中,开放式耳机凭借其别出心裁的设计和卓越的性能脱颖而出,受到了广大消费者的青睐。相较于传统耳机,开放式耳机几乎毫无短板,其耳挂式不入耳的设…

AI 就是实验科学

像生物学家而不是一数学家一样工作写短脚本而不是长程序 可视化一切 明白新发现通常发生在你做其他事情的时候 让你自己很幸运杂志照片实验 [Hubel and Weasel, 1964] (注:猫的视觉皮层逐层识别形状,奠定了卷积神经网络的生物学基础)

Camunda

Camunda 简介 Camunda是一个工作流引擎,执行Bpmn2.0标准。与它同类型的流程引擎有jbpm、activiti、flowable,但与Camunda相比,Camunda性能和稳定性都表现较好,更轻量级。 Camunda包括:流程设计器(Modeler)、流程引擎(Engine)、API接口(REST/Java API)、任务列表(Ta…

实验2-需求分析

一、实验题目 :需求分析 二、实验目的 1、掌握StarUML软件的安装; 2、掌握利用StarUML工具分析、设计、绘制用例图; 3、掌握利用StarUML工具分析、设计、绘制类图; 4、掌握利用StarUML工具分析、设计、绘制状态图; 5、掌握利用StarUML工具分析、设计、绘制顺序图。 6、掌握…

在Mac中打开终端的3种方法

在使用Mac时,有时需要深入研究设置,或者完成一些开发人员级的命令行任务。为此,你需要终端应用程序来访问macOS上的命令行。下面是如何启动它。 如何使用聚焦搜索打开终端 也许打开终端最简单、最快的方法是通过聚焦搜索。要启动聚焦搜索&a…

低速无人驾驶低时延高可靠如何实现

在繁忙的城市街道上,一辆无人驾驶汽车以优雅的姿态穿梭而过,它的动作流畅而精确,仿佛有一种隐形的力量在指引着它的每一个转弯和停靠。这不是科幻小说的情节,而是低时延高可靠性技术所带来的现实。一、5G网络:速度与反应的极致 5G网络是实现无人驾驶低时延的关键。它提供了…

小心!这些错误操作可能导致企业信息泄露!

在当今的数字经济中,企业信息安全已成为保障公司持续运营的核心要素。每一个不经意的操作,都可能成为导致敏感信息泄露的关键。在这篇文章中,我们将聚焦于那些看似无害但实际上充满风险的日常操作,帮助企业识别并避免这些潜在的威胁。内部员工的不当行为是导致企业信息泄露…

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布,它首次获得媒体评级委员会(MRC)的认证,在其企业零售媒体平台commerce Max和commerce Yield上,在桌面、移动网络和移动应用内…

呼叫系统的技术实现原理和运作流程,ai智能系统,呼叫中心外呼软交换部署

呼叫系统的技术实现原理和运作流程可以涉及多个组成部分,包括硬件设备、软件系统和通信协议。以下是一般情况下呼叫系统的技术实现原理和运作流程的概述: 硬件设备: 服务器:用于承载呼叫系统的核心软件和数据库。电话交换机&#…

若依框架中配置使得每次打包不修改前端访问接口IP和端口

1.添加配置文件配置文件中的数据和 application.yml 中的 context-path 保持一致 2.添加配置代码 <script type="text/javascript"> document.write("<script src=./static/config.js?v=" + new Date().getTime() + "><\/scrip…

P4168 [Violet] 蒲公英(题解)

题目 题目描述输入格式输出格式数据范围 ![] 样例 输入: 6 3 1 2 3 2 1 2 1 5 3 6 1 5 输出: 1 2 1思路 暴力 本题求区间内的最小众数,容易想到去用数组sum[i]表示第i种花的个数,在去便利比较,但是复杂度nm一定会T,这时候就要对暴力进行优化。 分块优化1 如果我们将…

网络监控:交换机监控新姿势

编者荐语: 本文是社区用户写的文章,通过 Categraf 的 SNMP 插件给网络监控提供了一个新的选择,转给大家参考。大家好,我是小斐呀。 关于网络监控领域前面文章主要是基于 SNMP Exporter + Prometheus + Grafana 的架构中介绍如何使用和部署,往期文章。 接下来我们基于前面的…

安装VMware vSphere vCenter 8.0

安装VMware vSphere vCenter 8.0 1运行安装程序 2语言选择中文 3点下一步 4接受许可协议,点下一步 5填写部署vCenter服务的ESXI主机IP地址以及对应ESXI主机的账号密码,这里将vCenter服务部署在192.168.1.14这台主机上 6接受证书警告 7设置vCenter的主机名字和root的密码 …

速卖通爆款商品打造全攻略:从选品到补单,步步为赢

跨境电商行业的竞争也越来越大&#xff0c;速卖通卖家自然也要为店内的爆款而努力&#xff0c;同时也要清楚地意识到爆款也是有时限的&#xff0c;那么一款爆款商品该如何打造呢&#xff1f; 1.选品。 开店时&#xff0c;面对世界各地的消费者群体&#xff0c;远比国内复杂得…

redis自学(38)故障转移

故障转移 当集群中有一个master宕机会发生什么呢?宕机7002节点,这是宕机之前的状态这是宕机以后的状态,7002失去连接了,而7002的slave8003变成了master启动以后7002变成slave了 Reids集群不需要sentinel,自动具有主从故障切换以上是自动故障转移 数据迁移 利用cluster fai…