IO概述IOinput/output是计算机系统中数据在不同实体间传输交互的抽象过程涵盖程序与外部设备如文件、硬件、网络的数据读写行为。本质上它是程序与外部环境建立“数据通道”的核心机制支撑着程序获取输入、输出结果的基本逻辑是软件与硬件、本地与远程交互的底层依托IO作用IO是程序与外部环境交互的基础桥梁。一方面它为程序提供“输入”能力支撑程序从文件、硬件、网络获取运行所需的数据另一方面通过“输出”功能程序可将计算结果持久化存储可视化展示或远程传输IO种类可从实现层级和应用场景两个维度分类实现层级分类系统调用IO也称为文件IO直接对接操作系统内核的最底层接口逻辑极简、性能接近硬件但是需要手动处理缓冲区、错误码等细节库函数IO也称之为标准IO基于系统调用封装的高层接口自动管理缓冲区、跨平台兼容、简化开发使用户态程序的常用选择应用场景分类文件IO针对磁盘文件的读写可通过“系统调用”或”库函数“实现设备IO与硬件设备交互。操作系统通过“设备抽象”将设备转换为文件系统中的特殊文件使程序能用统一的文件操作接口访问所有硬件网络IO实现网络数据收发依赖系统调用或者使更高层的框架。定义标准I/O是C库提供的输入输出函数集合由ANSI C标准统一规范为跨平台IO操作奠定基础跨平台性在UNIX系统、windows系统、Linux等多系统操作均实现标准I/O库让代码跨平台开发更顺畅高效实现原理通过缓冲机制内存临时存储数据减少直接系统调用次数降低硬件交互开销提升IO效率易用性设计基于系统底层调用封装屏蔽复杂硬件操作开发者无需关注设备细节简单调用函数即可完成IO流定义所有I/O操作抽象为字节的“移入/移出”程序的过程这种字节流动形态称为流。分类文件流按字符编码如ASCII、UTF-8处理注重文本语义二进制流直接操作原始字节保留数据原始形态如图片、可执行文件默认打开的流stdin标准输入流如键盘输入stdout标准输出流如屏幕打印stderr标准错误流专用于输出错误信息FILE对象定义FILE对象是一个结构体用于存储文件或流相关的所有状态信息FILE对象与流对应关系每个流在内存中由一个FILE对象表示通过FILE*指针访问标准流的特殊FILE对象stdin是标准输入流对应的FILE对象指针通常关联到键盘输入stdout是标准输出流对应的FILE对象指针通常关联到控制台输出sterr是标准错误流对应的FILE对象指针。通常关联到控制台用于输出错误信息由于FILE对象通常较大且内部结构复杂标准I/O函数不直接操作FILE对象本身而是通过FILE指针来间接访问。FILE指针是指向FILE对象的内存地址所有文件操作都基于这个指针进行FILE指针创建与销毁通过fopen进行创建FILE指针通过fclose进行销毁FILE指针FILE指针操作所有标准I/O函数都以FILE指针作为参数常见操作包括读写、定位、错误检查FILE对象与底层系统调用的关系FILE对象是标准库层面的抽象而LINUX内核通过文件描述符如0、1、2对应标准输入/输出/错误管理文件。FILE对象内部维护了一个文件描述符将标准I/O函数映射到底层系统调用并提供缓冲区优化。数据流动流程图标准IO的缓冲区定义标准I/O中的缓冲区是C语言标准库为优化文件读写效率设计的内存机制本质上是一段由FILE结构体管理的内存空间作用通过临时存储数据、批量处理可以减少硬件IO如磁盘、终端的交互次数提升程序效率缓冲策略标准I/O中设计了行缓冲、全缓冲、无缓冲三种策略来适配不同的场景也支持手动修改行缓冲默认用于终端设备如stdout、stdinLinux系统中行缓冲的大小为1024kb全缓冲默认用于文件LInux系统中全缓冲大小通常为4096kb无缓冲不使用临时内存暂存数据直接写入硬件无缓冲区的大小为0行缓冲刷新时机遇到换行符“\n”会刷新缓冲区程序正常结束会刷新缓冲区当文件关闭时会刷新缓冲区在输入和输出发生切换时会刷新缓冲区缓冲区写满未到换行符会刷新缓冲区主动调用fflush函数会强制刷新缓冲区行缓冲和全缓冲的区别是全缓冲不会遇到换行符刷新fflush函数文件IO介绍定义文件IO是在POSIX可移植操作系统接口中定义的一组输入输出的函数涉及操作系统和应用程序之间的交互用于读取和写入存储在永久性存储介质如硬盘、SSD、USB闪存盘等的数据跨平台性不同操作系统如UNIX、Windows、Linux的文件IO机制存在差异接口、调用方式和底层实现逻辑各有特点高效实现原理直接交互硬件/文件系统绕过高级缓冲直接发起系统调用访问磁盘等设备数据传输路径段适合对实时性、精准控制要求高的场景无用户态缓冲不依赖用户态缓冲机制每次读写更贴近硬件真实操作但频繁调用会增加系统开销需开发者按需优化易用性设计贴近底层逻辑需开发者熟悉操作系统API、文件权限、设备特性等直接处理缓冲区管理、错误码解析对开发经验要求高灵活但复杂可精准控制文件打开模式、数据传输细节却也因修手动处理资源释放、并发冲突等问题增加开发复杂度特点没有缓冲机制每次调用都会引起系统调用围绕文件描述符进行操作相当于标准IO中的流FILE*文件描述符是正整数默认打开三个描述符标准输入o 标准输出1 标准错误2除目录文件其他类型文件都可以操作可移植性相对较弱与标准IO对比文件描述符定义文件描述符是操作系统内核为每个打开的文件/设备分配的唯一整数标识符用于标识和跟踪进程与文件的交互在Linux/Unix中它是底层文件IO操作的核心参数本质它是指向内核中维护的文件表File Table该表中记录了文件的状态位置指针等信息每个进程都有自己独立的文件描述符表通常是从0开始的编号相互不干扰Linux系统中一个正在执行的陈鼓型中文件描述符的范围是【0-1023】可通过ulimit调整一般使用默认值作用连接用户进程与内核资源通过文件描述符进程可以请求内核进行文件续写、设备操作等无需关心底层实现细节资源管理操作系统通过文件描述符跟踪那些文件被那些进程打开并在进程关闭文件活退出时自动回收资源特点唯一性同一个进程内每个文件描述符对应唯一的打开文件非负整数通常是小整数如0、1、2但可动态分配如open返回的新描述符跨函数传递可在不同系统调用间传递代表对同一文件的持续操作常见文件描述符编号​​​​​​​