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

news2024/11/26 7:49:18

前言

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

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

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.区分内核文件结构体file和files_struct&C标准库中文件结构体FILE
  • 二.文件描述符fd与进程文件描述符表fd_array
    • 1.file_struct结构体介绍
    • 2.文件描述符fd与文件描述符表介绍
    • 3.文件描述符的分配规则
      • 【1】演示:(用到关闭文件描述符的系统调用:close )

一.区分内核文件结构体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结构体中有一块区域

在这里插入图片描述

3.文件描述符的分配规则

  • 文件描述符的分配规则总结:寻找 最小的 ,没有被使用的数据的位置,分配给指定的打开文件!

【1】演示:(用到关闭文件描述符的系统调用:close )

  • 输出结果为fd:3
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
 int fd = open("myfile", O_RDONLY);
 if(fd < 0){
 perror("open");
 return 1;
 }
 printf("fd: %d\n", fd);
 close(fd);
 return 0;
}
  • 关闭0或者2
  • 结果:关闭0时输出fd:0,关闭2时输出fd:2
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
 close(0);
 //close(2);
 int fd = open("myfile", O_RDONLY);
 if(fd < 0){
 perror("open");
 return 1;
 }
 printf("fd: %d\n", fd);
 close(fd);
 return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效医疗:Spring Boot医院管理解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

算法题总结(十一)——二叉树下

257、二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&…

【设计模式】软件设计原则——依赖倒置合成复用

依赖倒置引出 依赖倒置 定义&#xff1a;高层模块不应该依赖低层模块&#xff0c;二者都应该依赖抽象&#xff1b;抽象不应该依赖细节&#xff0c;细节应该依赖抽象。面向接口编程而不是面向实现编程。 通过抽象使用抽象类、接口让各个类or模块之间独立不影响&#xff0c;实现…

Charles安卓抓包环境配置

下载安装Charles 官网搜索然后直接下载就可以了 抓HTTP的包 HTTP代理 在Proxy->Proxy Settings里配置HTTP代理 手机上配置代理 进入WIFI&#xff0c;找到连接的网络&#xff0c;打开高级选项&#xff0c;里面有一个代理选项&#xff0c;将其改为手动&#xff0c;然后…

<<机器学习实战>>12-14节笔记:机器学习模型可信度、逻辑回归模型及多分类问题处理

12机器学习模型可信度 是否检验模型的指标好就一定说明模型可用&#xff1f;不是&#xff0c;必须得保证训练的样本和整天基本满足同一分布。 统计学习和机器学习区别&#xff1a;统计学习是根据样本模拟总体规律进而去预测&#xff08;当然要比对样本和总体的统计量是否一致&…

Bloom Filter 布隆过滤器

目录 简介 Bloom Filter的基本原理 实现 使用 HashFunc越多&#xff0c;性能越好吗&#xff1f; 如何尽量避免误判&#xff1f; 应用 布隆过滤器优点 简介 Bloom Filter是一种空间效率极高的概率数据结构&#xff0c;它用于测试一个元素是否属于集合。Bloom Filter的优…

wc命令:统计文本行数、单词数、字节数

一、命令简介 ​wc​&#xff08;word count&#xff09;是一个在类 Unix 系统中常用的命令行工具&#xff0c;用于统计文本文件的 行数​、单词数 ​和 字节数​。 ​​ ‍ 二、命令参数 ​wc​ 命令的基本语法如下&#xff1a; wc [选项] 文件选项&#xff1a; ​-c​…

Spring Validation 参数校验框架

目录 一.Maven依赖 二.参数校验 常用注解 1.Body参数校验 2.Params参数校验 2.1.Query参数校验 2.2.Path参数校验 三.全局异常处理器捕获校验异常 四.分组校验 1.分组校验 2.案例 2.1.登录 2.2.注册 五.嵌套校验 六.集合校验 七.自定义校验 八.快速失败(Fail …

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口-IP查询城市-IP解析城市

IP地址查询接口是指能够返回IP地址相关信息的网络接口&#xff0c;其返回的信息通常包括IP地址的归属地&#xff08;如国家、省份、城市等&#xff09;、运营商信息以及其他技术细节。以下是一些常见的IP地址查询接口及其特点&#xff1a; 一、国内IP地址查询接口 百度IP地址查…

Burp Suite为何能抓到HTTPS的明文流量,Wireshark可以吗,公司电脑的加密流量也是被监控了吗?

在前期博文《万字图文详解HTTPS协议通信过程&#xff0c;结合抓包实战解析带你一次看透HTTPS&#xff01;》中&#xff0c;我们知悉HTTPS通信内容是用会话密钥加密的&#xff0c;但不少细心的读者存在疑问&#xff1a;为何对于使用HTTPS协议的站点&#xff0c;在Burp Suite中拦…

5.人员管理模块(以及解决运行Bug)——帝可得管理系统

目录 前言一、页面修改表单展示修改 二、新增对话框修改三、修改对话框修改修改时展示创建时间 四、解决页面展示错误五 、 解决【java.lang.NullPointerException: null】 Bug 前言 提示&#xff1a;本篇完成人员管理模块的开发&#xff0c;具体需求、修改代码的路径和最终效…

2024年国庆节有哪些必囤的好物?搜罗到了五款超实用的数码好物!

​今年国庆节好多商家推出了一系列促销的活动&#xff0c;以庆祝这一重要节日。在这举国欢腾的日子里&#xff0c;除了享受假期带来的闲暇时光&#xff0c;也是时候犒劳一下自己&#xff0c;添置一些实用的数码用品了。为此&#xff0c;我特别为您搜罗到了五款超实用的数码好物…

考研笔记之操作系统(四) - 文件管理

文件管理 1. 简介1.1 前情回顾1.2 文件的属性1.3 文件内部数据的组织方式1.4 操作系统向上提供的文件功能1.5 文件应如何放在外存 2. 文件的逻辑结构2.1 无结构文件2.2 有结构文件2.2.1 顺序文件2.2.2 索引文件2.2.3 索引顺序文件2.2.4 多级索引顺序文件 3. 文件目录3.1 基本概…

PCIe配置篇(1)——如何进行配置操作(一)

一、功能的唯一标识——BDF 首先我们简单回顾一下总线&#xff08;Bus&#xff09;、设备&#xff08;Device&#xff09;、功能&#xff08;Function&#xff09;这几个概念&#xff1a; 功能&#xff08;function&#xff09;&#xff1a;是PCI设备中独立的功能单元&#xff…

文心一言 VS 讯飞星火 VS chatgpt (364)-- 算法导论24.3 6题

六、给定有向图 G ( V , E ) G(V,E) G(V,E)&#xff0c;每条边 ( u , v ) ∈ E (u,v)∈E (u,v)∈E 有一个关联值 r ( u , v ) r(u,v) r(u,v) &#xff0c;该关联值是一个实数&#xff0c;其范围为 0 ⩽ r ( u , v ) ⩽ 1 0⩽r(u,v)⩽1 0⩽r(u,v)⩽1 &#xff0c;其代表的意…

Sleuth、Zipkin学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

去掉最大最小值的部门平均薪水

有员工薪资表t3_salary,包含员工ID(emp_id)&#xff0c;部门ID(depart_id)&#xff0c;薪水(salary),请计算去除最高最低薪资后的平均薪水&#xff1b;&#xff08;每个部门员工数不少于3人&#xff09; CREATE TABLE t3_salary (emp_id bigint,depart_id bigint,salary decima…

使用springCache实现缓存

简介 这个springCache貌似jdk8或者以上才可以 cache最好加在controller层,毕竟返回给前端的数据,在这一步才是最完整的,缓存controller的数据才有意义配置 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

业务封装与映射 -- OTUk/ODUk/OPUk开销帧结构

开销是为了保证净荷正常、灵活传送所必须附加的供网络运行、管理和维护&#xff08;OAM&#xff09;使用的字节。 OTN电层开销包括OTUk开销、ODUk开销、OPUk开销、OTUCn开销、ODUCn开销、OPUCn开销和帧对齐开销。 SM开销属于OTU开销&#xff0c;占用3个字节&#xff1b;PM开销…

【HappyCoding 之前,如何做好需求分析?】

“代码没写完&#xff0c;哪有脸睡觉”&#xff1f;代码爱好者们如是说。在工作当中&#xff0c;开发者往往也要担任需求分析的角色&#xff0c;承担一些需求分析设计文档编写等工作&#xff0c;这对于一些刚入行的新手或是一些自我封闭的“代码高手”来说是比较头疼的&#xf…