当前位置: 首页 > article >正文

Linux文件偏移量与lseek()系统调用详解

1. 文件读写位置基础概念在Linux系统中每次打开一个文件时内核都会维护一个称为文件偏移量的指针。这个指针决定了下一个read()或write()操作将从文件的哪个位置开始执行。理解这个机制对于进行精确的文件操作至关重要。文件偏移量从0开始计数表示文件的首字节。当我们打开文件时偏移量默认指向文件开头即0位置。每次执行读写操作后偏移量会自动前进到已操作数据的下一个字节位置。例如如果从偏移量0处读取了100字节的数据那么偏移量将自动更新为100。重要提示文件偏移量是与文件描述符相关联的而不是与文件本身关联。这意味着如果两个不同的进程打开同一个文件它们会有各自独立的文件偏移量指针互不干扰。2. lseek()系统调用详解2.1 lseek()函数原型与参数lseek()是Linux系统中用于显式修改文件偏移量的系统调用其函数原型如下#include sys/types.h #include unistd.h off_t lseek(int fd, off_t offset, int whence);参数说明fd已打开文件的文件描述符offset偏移量值以字节为单位whence决定如何解释offset参数有以下三种取值SEEK_SET从文件开头计算偏移量SEEK_CUR从当前位置计算偏移量SEEK_END从文件末尾计算偏移量2.2 使用示例与注意事项让我们看一个实际的例子int fd open(example.txt, O_RDWR); if (fd -1) { perror(open failed); exit(EXIT_FAILURE); } // 将偏移量设置为文件开头后100字节处 off_t new_offset lseek(fd, 100, SEEK_SET); if (new_offset -1) { perror(lseek failed); close(fd); exit(EXIT_FAILURE); }注意事项对于普通文件偏移量必须是非负数。某些特殊设备可能允许负偏移量但这属于特殊情况。检查lseek()返回值时应该判断是否等于-1而不是简单地判断是否小于0。lseek()仅修改内核中的偏移量记录不会引发实际的I/O操作。不是所有文件类型都支持lseek()例如管道、FIFO、socket和终端设备就不适用。3. 文件空洞与稀疏文件3.1 文件空洞的产生机制当我们将文件偏移量移动到超过当前文件末尾的位置然后执行写操作时就会产生所谓的文件空洞。这种情况下文件中间未写入数据的部分会被系统视为空洞。// 创建空洞文件的典型代码片段 write(fd, buf1, sizeof(buf1)); // 在文件开头写入数据 lseek(fd, 16384, SEEK_SET); // 跳过一大段空间 write(fd, buf2, sizeof(buf2)); // 在远处写入另一段数据3.2 稀疏文件的特性与优势带有空洞的文件称为稀疏文件它具有以下特点空洞部分不占用实际磁盘空间只有被写入数据的部分才会分配存储块。读取空洞部分会返回0值空字节。文件名义大小可能远大于实际占用的磁盘空间。当向空洞中写入数据时系统才会为其分配磁盘空间。稀疏文件在以下场景特别有用创建大型数据库文件时预先分配空间虚拟磁盘映像文件需要快速扩展的大文件应用4. 实际应用案例与问题排查4.1 创建并检查空洞文件让我们通过一个完整的示例来演示如何创建和检查空洞文件#include fcntl.h #include sys/types.h #include unistd.h #include stdlib.h #include stdio.h char buf1[] First data block; char buf2[] Second data block far away; int main(void) { int fd; // 创建新文件 if ((fd creat(sparse_file, 0660)) 0) { perror(creat error); exit(EXIT_FAILURE); } // 写入第一个数据块 if (write(fd, buf1, sizeof(buf1)-1) ! sizeof(buf1)-1) { perror(buf1 write error); close(fd); exit(EXIT_FAILURE); } // 移动文件指针创建空洞 if (lseek(fd, 1024*1024, SEEK_SET) -1) { // 跳转到1MB位置 perror(lseek error); close(fd); exit(EXIT_FAILURE); } // 写入第二个数据块 if (write(fd, buf2, sizeof(buf2)-1) ! sizeof(buf2)-1) { perror(buf2 write error); close(fd); exit(EXIT_FAILURE); } close(fd); exit(EXIT_SUCCESS); }编译并运行后可以使用以下命令检查文件$ gcc sparse_file.c -o sparse_file $ ./sparse_file $ ls -lh sparse_file # 查看文件大小 $ du -h sparse_file # 查看实际磁盘占用 $ od -c sparse_file # 查看文件内容4.2 常见问题与解决方案lseek()返回-1可能原因文件描述符无效、文件不支持寻址、偏移量无效解决方案检查errno值确认文件类型是否支持寻址写入位置不符合预期可能原因多个进程同时修改文件偏移量解决方案考虑使用文件锁或原子操作稀疏文件不节省空间可能原因文件系统不支持稀疏文件解决方案检查文件系统类型ext4/xfs等现代文件系统都支持性能问题大文件操作时频繁lseek()可能导致性能下降解决方案批量读写数据减少寻址操作5. 高级技巧与最佳实践5.1 获取当前文件位置有时我们需要知道当前的文件偏移量可以通过以下方式实现off_t current_pos lseek(fd, 0, SEEK_CUR); if (current_pos -1) { perror(get current position failed); }这种方法利用了lseek()的特性当offset为0且whence为SEEK_CUR时函数返回当前偏移量而不改变它。5.2 大文件支持在32位系统上处理大文件(2GB)时需要注意编译选项$ gcc -D_FILE_OFFSET_BITS64 your_program.c这将确保off_t类型是64位的可以处理大文件偏移量。5.3 文件末尾操作快速定位到文件末尾并追加数据的常用方法lseek(fd, 0, SEEK_END); // 移动到文件末尾 write(fd, data, data_len); // 追加数据或者更简洁地使用O_APPEND标志打开文件int fd open(file.txt, O_WRONLY | O_APPEND);使用O_APPEND时每次write()都会自动定位到文件末尾无需显式调用lseek()。5.4 多线程环境下的注意事项在多线程程序中操作同一个文件描述符时文件偏移量是共享的。这意味着一个线程的lseek()会影响其他线程的读写位置如果需要独立操作应该为每个线程打开独立的文件描述符或者使用pread()/pwrite()函数它们不会改变文件偏移量ssize_t pread(int fd, void *buf, size_t count, off_t offset); ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);这些函数在指定位置直接进行I/O操作不会影响也不依赖当前的文件偏移量。

相关文章:

Linux文件偏移量与lseek()系统调用详解

1. 文件读写位置基础概念在Linux系统中,每次打开一个文件时,内核都会维护一个称为"文件偏移量"的指针。这个指针决定了下一个read()或write()操作将从文件的哪个位置开始执行。理解这个机制对于进行精确的文件操作至关重要。文件偏移量从0开始…...

七自由度机械臂嵌入式实时运动控制固件框架

1. 项目概述RobotControl_7Axis是一个面向七自由度(7-DOF)串联式机械臂的嵌入式运动控制固件框架,专为基于ARM Cortex-M系列微控制器(如STM32H743、STM32F429)的实时伺服驱动器节点设计。该项目并非通用机器人操作系统…...

嵌入式智能饮水机设计:STM32与语音交互实践

1. 项目背景与需求分析作为一名嵌入式开发工程师,我最近完成了一个专门为视障人士设计的智能饮水机项目。这个项目的灵感来源于我的一位视障朋友在使用传统饮水机时遇到的种种不便——他常常因为无法判断水温而被烫伤,或者因为不知道水杯是否对准出水口而…...

从乐高到变速箱:用一个完整案例,带你吃透SolidWorks自顶向下设计

从乐高到变速箱:用一个完整案例,带你吃透SolidWorks自顶向下设计 1. 为什么自顶向下设计是机械工程师的必修课 第一次用SolidWorks完成齿轮箱设计时,我犯了个典型错误——先画好所有齿轮和轴,最后才考虑箱体结构。结果发现轴承座位…...

保姆级教程:手把手教你用CANape和VX1000给ECU刷写镜像(附避坑指南)

汽车ECU刷写实战:从零掌握CANape与VX1000工具链 第一次接触汽车电子控制单元(ECU)刷写时,面对复杂的工具链和专业术语,很多工程师都会感到无从下手。CANape和VX1000作为行业内广泛使用的专业工具组合,其强大…...

别再为CUDA版本发愁了!手把手教你用Anaconda+PyCharm在Windows上搞定YOLOv11完整开发环境

从零搭建YOLOv11开发环境:Windows下的CUDA避坑指南与EMA注意力实战 刚接触计算机视觉的新手们,是否曾在配置深度学习环境时被CUDA版本冲突、PyTorch安装失败等问题折磨得焦头烂额?本文将带你用Anaconda和PyCharm在Windows系统上搭建一个稳定…...

HiveWE:革新性魔兽争霸III地图编辑器,重新定义创作效率

HiveWE:革新性魔兽争霸III地图编辑器,重新定义创作效率 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 当你在制作魔兽争霸III地图时,是否曾因原版编辑器的加载速度缓慢而…...

数字孪生简介

数字孪生简介摘要数字孪生(Digital Twin)作为连接物理世界与数字世界的核心技术,正在重塑全球产业格局。本报告系统梳理了数字孪生技术的概念演进、技术架构、行业应用及发展趋势,深入分析了其在智能制造、航空航天、智慧城市、医…...

Win11+Ubuntu22.04双系统避坑指南:如何正确分配分区空间(含CUDA安装建议)

Win11Ubuntu 22.04双系统分区策略与CUDA开发环境配置实战 作为一名长期在深度学习领域工作的开发者,我经历过无数次双系统安装的"血泪史"。特别是当项目 deadline 临近,却因为分区不当导致 CUDA 无法安装时,那种绝望感至今难忘。本…...

用Python给双足机器人做个“不倒翁”大脑:线性倒立摆仿真入门(附完整代码)

用Python给双足机器人做个“不倒翁”大脑:线性倒立摆仿真入门(附完整代码) 当你在公园里看到小朋友玩不倒翁时,有没有想过双足机器人也需要类似的"不倒"能力?线性倒立摆模型(LIPM)就是…...

大中华区21个主要城市甲级写字楼市场报告发布;DHL集团与中国外运将进一步深化全球业务协同 | 美通社一周热点简体中文稿

美通社每周发布数百上千篇中文企业资讯,想看完所有稿件可能很困难。以下是我们对过去一周不容错过的主要企业稿件进行的归纳,帮助记者和读者们及时了解一周发布的热门企业资讯。中国在欧洲的专利申请量超越日本首次跃升至前三欧洲专利局(European Patent…...

从GitHub热门项目到实战:手把手教你复现一篇ICLR‘24时间序列预测论文(附完整代码)

从GitHub热门项目到实战:手把手教你复现一篇ICLR24时间序列预测论文(附完整代码) 在人工智能领域,前沿论文与开源代码的结合正成为推动技术进步的重要动力。GitHub上涌现出大量包含顶会论文和配套实现的仓库,如AI4TS这…...

香熏哪个更值得推荐

在快节奏的现代生活中,香薰已成为许多人放松心情、提升生活品质的重要方式。然而,市面上的香薰产品琳琅满目,如何选择一款既安全又高效的香薰呢?本文将从多个角度分析,为什么树边香氛更值得推荐。1. 天然植萃&#xff…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.8】

3.6 JSON文档示例在本节,我们要熟悉数据交换标准JSON的优点。这个首字母缩写(发音是“Jason”)代表JavaScript对象标记(JavaScript Object Notation)。JSON的设计和XML如出一辙,两者通常都是用来存储和交换…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.7】

3.5 XML和R的实践现在让我们转到实际例子。XML文件在R会话中如何查看、如何导入、如何访问,以及如何把来自XML文档的信息转化为更便于进一步图形化或统计化分析的数据结构,例如常规的数据框(data frame)呢?正如我们前面…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.6】

3.2.4 注释及字符数据XML的语法提供了一种对内容进行注释的方式在<&#xff01;--和-->之间的所有内容都不被当作XML代码的一部分&#xff0c;从而会被解析器所忽略。注释可以用在标签之间或元素内容之内&#xff0c;但不能在元素名或属性名的内部使用。在数据值中有较多…...

JDK 1.8 vs JDK 17:jvisualvm 安装配置全攻略(附Visual GC插件避坑指南)

JDK 1.8 vs JDK 17&#xff1a;jvisualvm 安装配置全攻略&#xff08;附Visual GC插件避坑指南&#xff09; 在Java开发的世界里&#xff0c;JVM性能调优一直是开发者进阶的必修课。而jvisualvm作为Oracle官方提供的免费性能分析工具&#xff0c;可以说是我们窥探JVM内部运行状…...

机器学习实践指南【1.0】

第1章 机器学习引言本章将介绍机器学习及其涵盖的多个话题。你将了解以下内容&#xff1a;什么是机器学习分类方法概述聚类方法概述模型的选择和正则化概述非线性方法概述监督学习概述无监督学习概述增强学习概述结构化预测概述神经网络概述深度学习概述1.1 什么是机器学习人类…...

极验滑动验证码自动化实战:背景提取、缺口定位与Playwright滑动模拟

滑动验证码自动化实战&#xff1a;背景提取、缺口定位与Playwright滑动模拟 一、前言 在爬虫自动化、Web端自动化测试、业务流程自动化等场景中&#xff0c;人机验证是保障系统安全的重要防线&#xff0c;也是自动化流程中最常见的“拦路虎”。极验&#xff08;Geetest&#…...

OpenAI Agents SDK 中文实战指南:从入门到多代理协作

1. 为什么你需要OpenAI Agents SDK 第一次接触这个SDK时&#xff0c;我正为一个客户设计智能客服系统。传统方案需要写大量if-else逻辑判断用户意图&#xff0c;而Agents SDK的多代理协作机制让我眼前一亮——就像组建了一支各有所长的AI团队&#xff0c;数学问题自动转交数学专…...

OpenClaw安全加固:Phi-3-vision服务接口的权限控制实践

OpenClaw安全加固&#xff1a;Phi-3-vision服务接口的权限控制实践 1. 为什么需要安全加固&#xff1f; 上周我在本地部署了Phi-3-vision多模态模型&#xff0c;通过OpenClaw实现了一个智能图片分析工作流。但当我用手机测试时&#xff0c;意外发现任何人都能通过公网IP访问我…...

测试小白福音:在快马上通过实战代码轻松攻克软件测试面试题

作为一名刚入门的软件测试新手&#xff0c;面对各种面试题时常常感到一头雾水。最近我发现了一个特别实用的学习方法 - 通过动手实践来理解测试理论。今天就来分享一下我的经验。 从基础概念入手 刚开始学习时&#xff0c;我连黑盒测试和白盒测试的区别都搞不清楚。后来发现&…...

国内网站 SEO 推广需要多长时间见效

国内网站 SEO 推广需要多长时间见效 在当今互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为提升国内网站流量和品牌知名度的关键手段。很多人都会问&#xff0c;国内网站 SEO 推广需要多长时间才能见效&#xff1f;答案并不简单&#xff0c;因为这涉及…...

2026届必备的十大降重复率工具实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 维普 AIGC 检测系统&#xff0c;是特意为学术机构还有研究者用心设计的&#xff0c;它的主要…...

2026届学术党必备的十大降重复率工具推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下&#xff0c;各种各样的降AI工具纷纷出现&#xff0c;其关键功能是借助文本改写、句式重…...

Mac开发者必备:OpenClaw对接Qwen3-32B实现Xcode日志自动分析

Mac开发者必备&#xff1a;OpenClaw对接Qwen3-32B实现Xcode日志自动分析 1. 为什么需要自动化Xcode日志分析 作为一个长期与Xcode打交道的iOS开发者&#xff0c;我每天至少有2小时耗在编译错误和运行时日志的排查上。那些冗长的符号化崩溃日志、晦涩的Swift类型推断错误、以及…...

无感方波控制方案-脉冲启动与凸极性电机保护功能全面标题:‘无感方波方案-无抖动无反转启动...

无感方波方案&#xff0c;无感启动无抖动&#xff0c;无反转&#xff0c;启动方式为脉冲注入检测位置&#xff0c;换相方式为AD比较器&#xff0c;电机要有一定凸极性 &#xff0c;电机要有一定凸极性&#xff0c;电机要有一定凸极性&#xff01; 软件做有各种保护功能&#x…...

LabVIEW调用VisionPro框架代码:VisionPro labview 2020版

LabVIEW调用VisionPro框架代码 VisionPro labview 2020 最近在折腾LabVIEW和VisionPro的联动开发&#xff0c;发现这俩工业视觉领域的老搭档配合起来确实能玩出不少花样。今天咱们就聊聊怎么在LabVIEW 2020里直接调用VisionPro框架的代码&#xff0c;手头有工控机的朋友可以直接…...

如何为 3D 轮播文本添加可点击的 URL 链接

...

2026 AI行业封神之年:国产模型反超海外,AI短剧/视频/编程三大赛道掘金指南

2026年,AI行业正式迈入工业化落地的关键拐点,不再是技术圈的自嗨,而是全面渗透进写作、设计、影视、开发的各行各业。想抓住这波时代红利,又不想在数十个平台间反复横跳?https://n.kulaai.cn 给出了最优解——这个一站式AI模型聚合平台,直接把ChatGPT、Claude、Gemini、D…...