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

基础IO(2)

一 Linux文件描述符与重定向本质

一、核心概念与数据结构

  1. 进程与文件关联

    • 进程控制块task_struct中有一个*files指针,指向files_struct结构体
    • files_struct内部维护一个指针数组,每个元素是struct file*类型,指向一个打开的文件
    • 文件描述符 fd 本质就是这个数组的下标
  2. 默认打开的文件

    • 每个进程默认打开 3 个文件:
      • 0:标准输入(键盘)
      • 1:标准输出(显示器)
      • 2:标准错误(显示器)

二、重定向的本质

重定向的本质:就是修改数组特定下标内的内容

  • 例如将原本指向显示器的fd=1(标准输出),修改为指向log.txt文件,后续所有向 stdout 的输出就会写入到文件中
  • 这是 OS 层面的指向修改,语言层面(如 C 语言)只认 fd 数字,感知不到底层指向变化

三、文件描述符分配规则

分配文件描述符时,会找数组中值最小且没有被使用的 fd进行分配。

四、代码与函数说明

右侧展示了 C 语言示例代码与相关函数:

  1. 系统调用open()函数打开文件,返回文件描述符 fd
  2. C 标准库函数
    • fprintf(FILE *stream, ...):向指定流输出,stdout本质封装了 fd=1
    • write(int fd, ...):系统调用,直接向指定 fd 写入数据

二 使用 dup2 系统调用

一、dup2函数说明

  1. 函数原型int dup2(int oldfd, int newfd);
  2. 核心作用

    newfd成为oldfd的拷贝,如果newfd原本已经打开,会先关闭newfd再进行拷贝。

    • 本质是拷贝 fd 数组下标对应的内容(即把oldfd指向的struct file*指针,复制到newfd对应的数组位置)

二、重定向实现示例

dup2(fd, 1)为例(标准输出重定向):

  1. 先关闭原本指向 "标准输出 (显示器)" 的fd=1
  2. 将我们打开的文件fd对应的struct file*指针,拷贝到fd=1的数组位置
  3. 后续所有向fd=1(stdout)的写入,都会写入到我们打开的文件中,完成重定向

三、补充内核细节

每个打开的文件,在内核中都会有对应的file对象,保存了该文件相关的inode元信息。

三 在minishell中添加重定向功能

思路:先判断是不是重定向,不是的话就继续执行原来的步骤,是的话就解析,解析出来重定向的方式和保存重定向的目标文件,然后执行重定向,先open开保存重定向的目标文件,获取它的fd,使用dup2()系统调用。

四 理解 "一切皆文件"

每个设备都可以有自己的read、write,但⼀定是对应着不同的操作方法!!但通过
struct file 下 file_operation 中的各种函数回调,让我们开发者只用file便可调取 Linux 系
统中绝大部分的资源!!这便是“linux下⼀切皆文件”的核心理解。

一、核心设计思想:面向对象多态

"一切皆文件" 本质是用面向对象的多态思想,对所有 IO 设备做统一封装

  1. 基类层(统一接口)

    • 上层struct file作为 "基类",定义了统一的接口:int (*read)()int (*write)()等函数指针
    • 进程角度,只看到struct file,统一调用read/write接口,完全不需要关心底层是什么设备
  2. 子类层(设备 - specific 实现)

    • 不同硬件设备作为 "子类",实现自己专属的读写方法:
      • 键盘:read_keyboard()write_keyboard()
      • 显示器:read_screen()write_screen()
      • 网卡、其他硬件:各自实现read_XXX()write_YYY()
    • 每种设备的访问方法完全不同,但被统一封装在相同接口下

二、关键数据结构

  1. struct file_operations

    • 内核中定义的函数指针结构体,包含所有文件操作的接口:readwriteopenioctlmmap
    • 每个设备驱动会填充这个结构体,绑定自己的实现函数
  2. struct device

    • 描述底层硬件设备的结构体,包含设备 id、设备名称、设备状态等信息

三、虚拟文件系统(VFS)的作用

中间的虚拟文件系统层,就是实现这种 "一切皆文件" 多态的核心,向上给进程提供统一接口,向下适配不同的设备驱动。

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

相关文章:

  • 字节一面:省市区多级缓存怎么做?别上来就吹 Hash 和 ZSet 了!
  • 上海软件定制开发中的兼容性设计与多端适配技术方案解析
  • NI实时机(PXI)从裸机到联调:RT Linux系统安装与上电自启配置全流程
  • Vue项目实战:手把手教你集成Facebook JS SDK实现第三方登录(含测试用户配置)
  • 一天一个开源项目(第86篇):VibeVoice —— 微软开源的前沿语音 AI,单次处理 90 分钟多说话人音频
  • SAP VC配置实战:手把手教你用CU01和CS02玩转对象相关性(Object Dependencies)
  • 3分钟解锁Axure RP中文界面:免费汉化包终极指南
  • 赛恩科仪OE1022锁相放大器在单相多铁氧体的材料应用
  • 2026年4月上海离婚律师选型参考:实战维度全解析 - 优质品牌商家
  • FreeModbus释放底层的 TCP 监听端口
  • 上海物联网应用开发平台选型指南:架构机制与工程落地的核心考量
  • Ansys | 传统烤箱 vs 对流烤箱:饼干加热过程的热分析对比
  • 构建你的 AI 原生工业数据底座
  • IwrQk:免费开源的Iwara跨平台客户端完整使用指南
  • Kubernetes密钥管理实战:基于AWS Parameter Store的Secret自动同步方案
  • ARM PMU性能监控单元架构与RLU/RLH机制解析
  • 告别裸奔CAN!用STM32+CanFestival实现设备间基础通信(附对象字典配置心得)
  • 告别数据丢失焦虑:用DiskGenius给老硬盘MBR转GPT的保姆级图文教程
  • 3个关键步骤实现TigerVNC在国产ARM平台的高性能适配
  • Movelt2 规划场景 ROS API
  • 终极指南:如何快速重置Cursor AI编辑器试用限制,恢复完整功能
  • 【2026实测】论文AI率居高不下?3大高阶指令+4款工具快速降AI指南
  • SAP批次管理配置保姆级教程:从激活到查找策略,手把手带你走通全流程
  • 2026年黄金高价回收无套路:从检测到变现的全流程技术解析 - 优质品牌商家
  • 工业数据采集系统选型与误差控制实战指南
  • FPGA在高性能计算中的优势与应用实践
  • 告别C盘爆红!Windows Cleaner智能清理工具全攻略
  • ARM嵌入式认证考试全面指南
  • 湛江黑石材技术深度拆解:工艺、性能及靠谱选型推荐 - 优质品牌商家
  • 云原生技术体系解析