文件小注意

news2025/6/20 8:18:02

目录

0 前言

1 标识 O_CREAT O_APPEND

2 ftruncate与truncate

3 O_DIRECT与O_DSYNC、O_SYNC

4 open与fopen

5 关于mmap


0 前言

文件操作在软件开发中是很常见的一件事。虽然与它相关的工作看起来不怎么起眼,无非就是通过通过open、read、write、close几个调用搞定的事情,但也正是这种看似简单的工作,在稍加变化需求的场景中,会给你带来意想不到的麻烦。这里就记录本人最近关注到的几个点,做为小例子,分享给大家。

多说一句,往往简单的事情会给人带来大麻烦,就是因为人的大脑会对简单或者认为简单的事情过于麻痹大意,先入为主,不加重视,导致往往只看到冰山一角。该怎么做,不用多说了,直接看实例。(本文都是基于Ubuntu系统)

1 标识 O_CREAT O_APPEND

对于linux下的open调用,你敢说man里面的这些flags你都清楚了?

如果路径下未有文件,就需要O_CREAT标识,否则open就会失败。如果想让文件处于追加写的状态,则需要O_APPEND标识。这还是简单的标识,还有许多复杂标识等着我们深入了解。

man手册对于系统调用都有详尽的说明,很多人其实是比较抗拒看man手册的,往往通过百度了解一下接口的使用,就开始调用了。这主要是man手册为英文写成,很多时候搞清楚一个接口需要花比较多的时间,另外个别语句还可能比较绕口,有时候琢半天也不明白意思,这个时候不如直接百度来的称手。但是这些都是初期的阵痛与障碍,时间长了,就会习惯,而且效率也会变高不少。

等等,有人可能会说,man open的时候,看不到关于open接口的说明。这个时候,需要安装一下,apt install manpages-dev

关于man的使用,可以参考博主之前的一篇文章:https://blog.csdn.net/wwwyue1985/article/details/123929554

2 ftruncate与truncate

使用open调用创建文件后,文件大小为零。这个时候,如果通过mmap建立文件映射,那么写文件内存会失败(会报Bus error的错误)。同样,如果文件大小不够,写范围超过文件大小时,也会失败。也就是说,文件大小不会随着写内容的增加而增大。貌似window倒是支持这一点,神奇吧。此时,我们可以通过ftruncate来扩展文件大小。如果查看man手册,我们会发现另外一个接口truncate。二者有什么区别呢?

通过手册,可以看到,使用ftruncate时,文件必须打开,且支持写入;使用truncate接口,文件必须是可写的。

3 O_DIRECT与O_DSYNC、O_SYNC

操作系统为了提高文件读写性能,特别是像磁盘这种不支持随机读写的设备(需要旋转盘面和移动磁头),往往会在内存中开辟一片缓冲区。写入文件的内容不会立即写入硬件设备,而是先写到文件的缓冲区,当攒够一定量或者满足某些特征(也可能是内核自己排序,使得对硬件设备的访问尽可能有序)之后,才会触发写设备,以此来提高落盘性能。但有时候,我们又想让写入文件的内容立即同步到磁盘等硬件设备(比如一些关键的日志或者元数据),以免意外事件(比如断电)导致关键信息丢失或文件不可用。此时,O_DIRECT标识就需要登场了。使用O_DIRECT标识意味着写文件的数据会同步传输到硬件设备:

但如果我们看man手册,会发现有相似功能的其他标识,比如O_DSYNC、O_SYNC:

这几个标识有什么区别呢?根据man手册说明,上面两个sync标识跟direct标识的差异主要在是不是同步文件元数据。什么是文件元数据?内核为了管理文件,需要一些辅助数据,比如文件的名称、大小、创建时间、磁盘位置等等,这些都不是文件内容本身的数据,而是为了管理文件所需的数据,这类数据就是元数据。当我们向文件写入内容的时候,文件的元数据可能就会发生变化,使用这里的带sync的两个标识,则操作系统不仅帮我们同步文件本身的内容,也同步文件相关的元数据。

那有人可能就又问了,同样是支持同步元数据,O_DSYNC和O_SYNC又有什么区别呢?根据man手册说明,O_DSYNC仅同步与输出数据相关的元数据,而O_SYNC同步文件相关的元数据。所以从集合的角度来看,应该是O_SYNC包含O_DSYNC,O_DSYNC包含O_DIRECT的关系。

4 open与fopen

我们平时操作文件时,会发现有两套类似的接口,open与fopen。它们的使用上有一些差别,很多人往往是通过网络复制一份代码,简单改改就使用,可能没有细究过open与fopen有什么区别。其实,fopen是C库提供的接口,而open是系统调用。从可移植性的角度来看,fopen的通用性更强(一些不支持操作系统的嵌入式系统中也支持,比如xilinx就自己提供了一套文件库,可以在裸机程序中使用上述fopen类接口)。但是在Linux下,fopen最终也是通过open这个系统调用实现的。Open类接口不仅支持普通文件,还支持被系统抽象为文件的所有东西,比如各种各样的设备。这样描述,大家是不是就清楚了。

5 关于mmap

额外补充一点,关于文件mmap映射的。用户空间看到的是(接口返回值)进程虚拟地址空间的一个虚拟地址,内核帮我们建立了页表并完成了物理地址到虚拟地址的映射。当我们将数据写入这个虚拟地址时,就相当于写入文件在内存的缓冲区。同步后,数据就体现到硬件上最终的文件中。基于这一点,我们可以在用户空间,对文件访问进行专门的优化。

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

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

相关文章

Unity——网格变形(制作一个压力球)

主要参考链接:Mesh Deformation, a Unity C# Tutorial(本文为其翻译版) unity项目下载链接:https://download.csdn.net/download/weixin_43042683/87679832 在物体上投射射线并画出调试线。将力转换为顶点的速度。用弹簧和阻尼保…

Rust社区引发舆论危机,问题到底出在哪儿?

围绕开源的法律问题,讨论焦点往往集中在开源许可证、软件著作权等方面,商标的讨论却极少引人关注。事实上,关于开源软件以及开源软件的衍生产品的商标使用情况往往处于某种灰色地带。 最近,Rust基金会正在就更新的商标政策征求反馈…

windows命令执行的几种绕过方法

windows命令执行的几种绕过方法介绍1、添加特殊符号2、定义变量3、切割字符串4、逻辑运算符在绕过中的作用5、利用for循环拼接命令介绍 反检测、反清理,是红队攻击中的重中之重,本文详细描述了几种windows执行命令的几种绕过手法。 1、添加特殊符号 w…

ERP软件的作用

ERP软件的运用是在企业管理系统的数据基础上实现的,它的应用涉及到企业的各个部门。ERP软件是在制造资源计划的基础上进一步发展而成的对企业供应链的管理软件。ERP是集采购、销售和库存、财务、生产管理和委托加工为一体的企业管理软件。它是集企业管理理念、业务流…

带你玩转Python爬虫(胆小者勿进)千万别做坏事·······

这节课很危险,哈哈哈哈,逗你们玩的 目录 写在前面 1 了解robots.txt 1.1 基础理解 1.2 使用robots.txt 2 Cookie 2.1 两种cookie处理方式 3 常用爬虫方法 3.1 bs4 3.1.1 基础介绍 3.1.2 bs4使用 3.1.2 使用例子 3.2 xpath 3.2.1 xpath基础介…

【计算机图形学】扫描转换算法(Bresenham1/4圆法 椭圆两头逼近法 方形刷子)

一 实验目的 编写弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨熟悉圆和椭圆画线的算法二 实验算法理论分析Bresenham法(1/4圆): 椭圆扫描转换——两头逼近法: 处理线宽问题: 方形刷子宽度存在的…

JS内置对象1

JS中的对象分为:自定义对象、内置对象、浏览器对象内置对象:JS语言自带的一些对象,已经提高最基本的功能常见内置对象:Math、Date、Array、String学习内置对象可通过查阅文档,即MDN/W3C来查阅 …

3.1 微分中值定理

思维导图: 学习目标: 我会按照以下步骤来学习微分中值定理: 理解导数的定义和性质:在学习微分中值定理之前,首先要对导数的定义和性质有一个清晰的理解,包括导数的几何意义和导数存在的条件等。学习拉格朗…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么?背景:ChatGPT敢为人先,打破全球僵局示例演示:基于ChatGPT微应用实现的条件及步骤(1)整体框架(2)搭建前的准备工作(3)实际搭建步骤&a…

算法之搜索专题

搜索 深度优先搜索(DFS)和广度优先搜索(BFS)都是常见的图搜索算法。它们的目的是访问和遍历图中的所有节点,并找到满足特定条件的节点。虽然这两种算法的实现方式不同,但它们都有以下的特点。 首先&#…

或许能用 ChatGPT 插件实现财富自由

文章目录或许能用 ChatGPT 插件实现财富自由1. 认识一下1.1 是什么1.2 怎么用2. 举个例2.1 Wolfram2.2 Browsing3. 怎么做到的4. 财富自由4.1 生活类插件4.2 品牌推广类5. 限制或许能用 ChatGPT 插件实现财富自由 我们知道,当前 ChatGPT 最大的局限性就是模型训练数…

如何编写一个自己的web前端脚手架

脚手架简介 脚手架是创建前端项目的命令行工具,集成了常用的功能和配置,方便我们快速搭建项目,目前网络上也有很多可供选择的脚手架。 一个"简单脚手架"的构成其实非常少,即 代码模板 命令行工具。其中代码模板是脚手…

【李宏毅】-生成对抗式网络(GAN)

生成对抗式网络GAN 1. Network as Generator 输入不再是只是x,还有一个simple distribution(样本分布),输出也是一个分布 Why distribution 不同的分布即意味着:相同的输入会有不同的输出。 尤其在任务需要创造力的时…

Win+VisualStudio+vcpkg+Zeromq安装方法

1. 缘由 因为工作上要用到Windows上的zeromq来收发消息,所以我在网上搜集了一些资料最终成功地在Visual Studio2022中用c的libzmq库实现了zmq的收发。 2. 基本资料 2.1 ZeroMQ基本介绍 ZeroMQ官网介绍,因为我也不是专门搞网络和通信的,就…

RocketMQ 事务消息 详解

🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年4月9日 &#x1…

VMware ESXi 8.0c - 领先的裸机 Hypervisor (sysin Custom Image)

本站发布 Dell 和 HPE 定制版 ESXi 8.0c 镜像 请访问原文链接:https://sysin.org/blog/vmware-esxi-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 产品简介 VMware ESXi:专门构建的裸机 Hyperviso…

【MATLAB数学建模编程实战】Kmeans算法编程及算法的简单原理

欢迎关注,本专栏主要更新MATLAB仿真、界面、基础编程、画图、算法、矩阵处理等操作,拥有丰富的实例练习代码,欢迎订阅该专栏!(等该专栏建设成熟后将开始收费,快快上车吧~~) 【MATLAB数学建模编…

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…

NumPy 秘籍中文第二版:二、高级索引和数组概念

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 安装 SciPy安装 PIL调整图像大小比较视图和副本翻转 Lena花式索引位置列表索引布尔值索引数独的步幅技巧广播数…

比尔·盖茨最新分享:ChatGPT的发展,不止于此

来源: 笔记侠 最近,ChatGPT、GPT 4、文心一言、Copilot,人工智能产品层出不容,一路轰炸;王慧文、王兴、李开复等各位高调以及低调的商业领袖和技术专家,纷纷入局AI赛道。人声鼎沸,十分热闹。 昨天&#xff…