【Linux】认识Linux内核中进程级别的文件结构体【files_struct】&文件IO模型初步演示

Linux内核进程文件结构体及文件IO模型

前言

大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

一.区分内核文件结构体file和files_struct&C标准库中文件结构体FILE

  • FILE结构体: C标准库 中定义的一个结构体,用于表示一个打开的文件流,并封装了文件操作的相关信息。
  • file结构体:它代表一个打开的文件,是Linux内核中的结构体
  • 区分: files_struct结构体:是Linux内核中定义的一个结构体,用于表示 进程级别 的文件描述符表,并记录了该进程当前打开的所有文件的信息。

如下图:进程结构体task_struct有一个文件指针指向files_struct结构体,files_struct结构体经过系统调用open后生成file结构体:
在这里插入图片描述

二.文件描述符fd与进程文件描述符表fd_array

1.file_struct结构体介绍

files_struct结构体是Linux内核中定义的一个结构体,用于表示进程级别的文件描述符表。在Linux系统中,每个进程都有一个与之关联的文件描述符表,该表记录了该进程当前打开的所有文件的信息。以下是files_struct结构体的一些关键字段:

  • **fd_array[]:**这是一个指针数组,用于存储指向file结构体的指针。每个指针都指向一个打开的文件的file结构体,而文件描述符就是该指针数组的下标。
  • **文件引用计数:**files_struct结构体还包含了一些用于管理文件描述符和文件引用的计数信息。例如,每个打开的file结构体都有一个引用计数,表示有多少个文件描述符指向它。当引用计数降为零时,表示没有文件描述符再指向该文件,此时可以关闭该文件并释放相关资源。
    在这里插入图片描述

2.文件描述符fd与文件描述符表介绍

  • fd_array是一个 指针数组 ,用于存储指向file结构体的指针。每个指针都指向一个打开的文件的file结构体,而 文件描述符就fd是 该指针数组的下标。
  • 注意:进程运行的时候默认把 标准输入,标准输出,标准错误 打开, 占用了fd0,1,2位 ,为了让程序员默认进行输入输出代码编写(0,1,2对应的物理设备一般是:键盘,显示器,显示器)
  • files_struct结构体中有一块区域

在这里插入图片描述

<think>我们使用mermaid的graph TD语法来绘制关系图。根据提供的引用内容,我们可以总结出以下关系: 1. task_struct进程描述符,每个进程或线程都有一个task_struct。 2. mm_struct描述进程的地址空间,一个进程的所有线程共享同一个mm_struct(引用[2]提到:创建线程时,直接将主线程task_struct中的mm域直接给了被fork出来的task_struct的mm域)。 3. fs_struct包含文件系统信息,如当前工作目录和根目录。 4. files_struct包含该进程打开的文件信息。 5. signal_struct用于处理信号。 关系: - task_struct中包含指向mm_struct的指针(mm域) - task_struct中包含指向fs_struct的指针(fs域) - task_struct中包含指向files_struct的指针(files域) - task_struct中包含指向signal_struct的指针(signal域) 注意:在Linux内核中,这些结构体之间的关系是包含关系(指针)。此外,对于多线程进程,多个task_struct可能共享同一个mm_struct, fs_struct, files_struct和signal_struct。 因此,我们可以绘制如下关系图: </think>根据Linux内核进程管理的相关知识,我将绘制`task_struct`与其他关键结构体的关系图。关系图使用Mermaid语法表示,清晰展示进程描述符的内部关联: ```mermaid graph TD A[task_struct] -->|包含指针| B(mm_struct) A -->|包含指针| C(fs_struct) A -->|包含指针| D(files_struct) A -->|包含指针| E(signal_struct) B -->|描述| F[进程地址空间] C -->|描述| G[文件系统信息] D -->|描述| H[打开文件表] E -->|描述| I[信号处理] style A fill:#f9f,stroke:#333 style B fill:#cff,stroke:#333 style C fill:#cfc,stroke:#333 style D fill:#fcc,stroke:#333 style E fill:#ffc,stroke:#333 ``` ### 关系解析: 1. **核心结构** `task_struct`是进程描述符(包含进程所有信息),直接包含指向其他四个结构体的指针: - `mm_struct`:进程地址空间管理(虚拟内存映射、堆栈等)[^2][^3] - `fs_struct`:文件系统信息(根目录/当前工作目录等) - `files_struct`:打开文件表(文件描述符数组) - `signal_struct`:信号处理配置(信号处理函数、阻塞信号集等) 2. **共享机制** 多线程进程中,所有线程共享同一个: - `mm_struct`(地址空间) - `fs_struct`(文件系统视图) - `files_struct`(打开文件表) - `signal_struct`(信号处理设置) 通过`clone()`创建线程时复用父线程的这些结构[^2] 3. **关键字段示例** ```c struct task_struct { struct mm_struct *mm; // 内存描述符 struct fs_struct *fs; // 文件系统信息 struct files_struct *files; // 打开文件struct signal_struct *signal; // 信号处理器 // ... 其他300+字段 }; ``` ### 绘制工具建议: 1. **文本绘图** 使用支持Mermaid的工具: - VS Code + Mermaid插件 - Markdown编辑器(Typora等) - 在线编辑器:mermaid.live 2. **可视化工具** - Draw.io(选择Entity Relationship模板) - PlantUML(使用composition语法) > 图注说明:实线箭头表示**直接包含关系**,虚线框表示**共享结构体**的边界范围[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY的秘密代码小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值