一.文件IO的介绍
1.定义:
文件IO是在POSIX(可移植操作系统接口)中定义的一组输入输出的函数,
涉及操作系统和应用程序 之间的交互,用于读取和写入存储在永久性存储介质(如硬盘、SSD、USB闪存盘等)上的数据;
2.跨平台性:
不同操作系统(如UNIX、Windows、Linux)的文件IO机制存在差异,接口、调用方式和底层实 现逻辑各有特点;
3.高效实现原理:
1.直接交互硬件/文件系统:
绕过高级缓冲,直接发起系统调用访问磁盘等设备,数据传输路径短,适 合对实时性、精准控制要求高的场景(如设备驱动开发);
2.无用户态缓冲:
不依赖用户态缓冲机制,每次读写更贴近硬件真实操作,但频繁调用会增加系统开 销,需开发者按需优化(如手动合并读写请求);
4.特点:
1.没有缓冲机制,每次调用都会引起系统调用;
2.围绕文件描述符进行操作,相当于标准IO中的流(FILE *),文件描述符是正整数;
3.默认打开三个描述符:标准输入(0) 标准输出(1) 标准错误(2)
4.除目录文件,其他类型文件都可以操作;
5.可移植性相对较弱;
5.与标准IO区别
|------|----------------------------------|-----------------------|
| | 文件IO | 标准IO |
| 概念 | 对文件系统中的文件进行读写 | 程序与终端(控制台)的交互 |
| 用途 | 持久化存储、跨程序数据交换 | 即时交互、简单调试 |
| 操作对象 | 磁盘文件(需路径或描述符) | 以流为抽象,覆盖终端和磁盘文件 |
| 数据流向 | 程序 ⇄ 磁盘(持久化) | 程序 ⇄ 终端(临时交互) |
| 缓冲机制 | 默认缓冲 | stdout:行缓冲 stderr:无缓冲 |
| 错误处理 | 需显式处理文件不存在、权限不足等 | 通常无需特殊处理(终端直接反馈) |
| 典型场景 | 配置文件读写、日志记录、数据存储等等 | 命令行参数输入、结果显示、错误提示等等 |
| 性能特点 | 大文件或批量读写,文件IO通过手动优化(调整读写块大 小)更高效 | 频繁小数据读写时,标准IO的缓冲机制更高效 |
| 生命周期 | 数据持久保存 | 会话结束后数据丢失 |
二.文件描述符
1.定义:
文件描述符是操作系统内核为每个打开的文件/设备分配的唯一整数标识符,用于标识和跟踪进程 与文件的交互,在Linux/Unix中,它是底层文件IO操作的核心参数;
2.本质:
1.它是指向内核中维护的文件表(File Table),该表中记录了文件的状态,位置指针等信息;
2.每个进程都有自己独立的文件描述符表,通常是从0开始的编号,相互不干扰;
Linux系统中一个正 在执行的程序中文件描述符的范围是0-1023,可通过ulimit调整,一般使用默认值;
3.作用:
1.连接用户进程与内核资源:通过文件描述符,进程可以请求内核进行文件读写、设备操作等,无需 关心底层实现细节;
2.资源管理:操作系统通过文件描述符跟踪哪些文件被哪些进程打开,并在进程关闭文件或退出时自 动回收资源
4.特点:
1.唯一性:同一个进程内,每个文件描述符对应唯一的打开文件;
2.非负整数:通常是小整数(如0、1、2),但可动态分配(如 open()返回的新描述符);
3.跨函数传递:可在不同系统调用间传递,代表对同一文件的持续操作;
5.常见文件描述符编号:
