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

文件IO概念

一、文件IO介绍与标准IO对比

1.1 介绍

项目说明
定义POSIX (可移植操作系统的接口)定义的一组输入输出函数,用于应用程序与操作系统交互,读写硬盘、SSD、U盘等永久性存储介质上的数据
跨平台性不同操作系统(UNIX/Windows/Linux)接口、调用方式、底层实现各异,如 Windows 有CreateFile,Linux 基于open/read等系统调用
高效实现原理1.直接交互硬件/文件系统:绕过高级缓冲,直接发起系统调用,适合实时性、精准控制场景(如设备驱动)
2.无用户态缓冲:每次读写贴近硬件操作,但频繁调用增加系统开销,需开发者手动优化(如合并读写请求)
易用性设计1.贴近底层逻辑:需熟悉操作系统 API、文件权限、设备特性、错误码解析(如errno),对开发经验要求高
2.灵活但复杂可精准控制打开模式、数据传输细节,但需手动处理资源释放(如close)、并发冲突等
特点

无缓冲机制,每次调用都会引起系统调用
围绕文件描述符操作(相当于标准 IO 的FILE *(文件指针)),文件描述符是正整数

文件描述符由_fileno记录
• 默认打开三个描述符:标准输入(0)、标准输出(1)、标准错误(2)
除目录文件外,其他类型文件都可以操作
可移植性相对较弱

_fileno是FILE对象中记录文件描述符的成员

调用时采用文件流->_fileno,比如标准输入流就采用以下

stdin->_fileno

1.2 标准IO对比

对比维度文件 IO标准 IO
概念文件系统中的文件进行读写程序与终端(控制台)的交互
用途持久化存储、跨程序数据交换即时交互、简单调试
操作对象磁盘文件(需路径或描述符流为抽象,覆盖终端和磁盘文件
数据流向程序 ⇄ 磁盘(持久化)程序 ⇄ 终端(临时交互)
缓冲机制默认缓冲(无用户态缓冲stdout:行缓冲
stderr:无缓冲(有缓存策略)
错误处理显式处理文件不存在、权限不足通常无需特殊处理(终端直接反馈)
典型场景配置文件读写、日志记录、数据存储命令行参数输入、结果显示、错误提示等
性能特点大文件或批量读写时,通过手动优化(调整读写块大小)更高效频繁小数据读写时,标准 IO 的缓冲机制更高效
生命周期数据持久保存会话结束后数据丢失(短暂)

标准IO:fopen() 返回文件指针 FILE* 流

文件IO: open() 返回文件描述符

二、文件描述符

2.1 介绍

项目详细说明
定义操作系统内核为每个打开的文件/设备分配的唯一整数标识符,用于标识和跟踪进程与文件的交互;在 Linux/Unix 中,是底层文件 IO 操作的核心参数
本质1. 指向内核中维护的文件表(File Table),该表记录了文件的状态、位置指针等信息。
2. 每个进程都有自己独立的文件描述符表编号从 0 开始,进程间互不干扰。
3. Linux 系统中,默认范围是[0-1023](可通过ulimit调整)。
作用1.连接用户进程与内核资源:通过文件描述符,进程可请求内核进行文件读写、设备操作等,无需关心底层实现细节。
2.资源管理:操作系统通过文件描述符跟踪文件被哪些进程打开,并在进程关闭文件或退出时自动回收资源。
特点1.唯一性:同一进程内,每个文件描述符对应唯一的打开文件
2.非负整数:通常是小整数(如 0、1、2),可动态分配(如open()返回新描述符)。
3.跨函数传递:可在不同系统调用间传递,代表对同一文件的持续操作。

通过ulimit -a显示出的open files可以查看文件描述符

2.2 常见文件描述符编号

编号宏定义用途对应设备
0STDIN_FILENO标准输入 (Standard Input)通常是键盘
1STDOUT_FILENO标准输出 (Standard Output)通常是终端屏幕
2STDERR_FILENO标准错误 (Standard Error)通常是终端屏幕

打开新文件时,系统会分配未被使用的最小文件描述符

关闭文件后,其对应的文件描述符可以被重新分配;

close()释放描述符后,后续打开新文件时,系统会优先将该编号分配给新的文件。

系统分配规则:打开新文件时,系统会分配当前未被使用的最小非负整数作为文件描述符。

标识符可能是0、1、2的情况:

如果先关闭了标准输入close(0)),再打开新文件,系统会分配0

同理,关闭标准输出或标准错误后,新文件可能获得12

http://www.jsqmd.com/news/619478/

相关文章:

  • VISIO等比例放大缩小图片
  • 解锁HS2完整体验:从日语盲到汉化高手的蜕变之旅
  • 【快速EI检索 | SPIE出版】2026年物联网、通信工程与人工智能国际学术会议(IoTCEAI 2026)
  • 华硕笔记本性能优化终极指南:5分钟掌握GHelper轻量控制工具
  • cad文件怎么用gis打开
  • Qwen3.5-2B对象检测实战:与YOLOv5协同的智能标注与结果分析
  • 2026年贵阳家装整装5大品牌实测深度横评与选购避坑指南 - 精选优质企业推荐榜
  • 【JavaScript高级编程】拆解函数流水线 上呕
  • HS2-HF_Patch终极汉化与增强指南:从新手到高手的完整解决方案
  • Qwen3-14B Java八股文深度学习:原理剖析与面试对答如流
  • phpstorm最新版破解
  • Java开发者指南:亚马逊SP-API对接实战与IAM权限配置详解
  • OncePower v2.20.0文件批量重命名工具零门槛高级匹配,附加文件整理功能
  • Freqcycle添加
  • AI 大模型职业选择磐
  • WinISO:解决光盘镜像编辑与制作的三大实际问题
  • 工业领域再发力,麒麟信安树立自主创新基础软件规模化应用又一新标杆
  • PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践)
  • 赋能开发——当通用 AI 遇见葡萄城“专属大脑”
  • PCB贴合涂层附着力测试3种核心方法详解
  • QAnything C++扩展开发:高性能PDF解析模块实现
  • 电路设计实战:如何用Draw.io ECE库打造专业级工程图纸
  • 云原生应用开发最佳实践:构建现代化的云原生系统
  • 批量照片分类工具使用说明:按拍摄日期/相机型号/分辨率分类,支持模板命名与复制移动
  • OpenClaw成本优化:Qwen3.5-9B自部署与Token消耗监控
  • Z-Image-GGUF赋能在线教育:自动生成习题插图与知识图谱
  • 【质量管理】信息系统项目管理师论文范文
  • Milla 很漂亮,不代表 MemPalace 就适合你的 OpenClaw
  • Gemini-2.5-Pro实战测评:从代码生成到医疗诊断,如何解锁30天高级会员体验
  • CnOpenData 深市IPO预披露文件