【文件fd】文件描述符fd | 文件描述表

目录

1.文件描述符fd

2.系统调用的0/1/2

3.C语言的stdin/stdout/stderr

4.系统调用的0/1/2和C语言的stdin/stout/stderr二者的关系❓

5.文件描述表

5.1 文件描述符概念

5.3 文件对象strcut file

5.4 进程和文件对应关系

5.5 文件描述符理解

5.6 源码查看 


1.文件描述符fd

  • open系统调用的返回值是一个整数fd。
  • 成功创建一个新的文件描述符(整数),失败就-1和错误码被设置。
  • man open
  • /return val

2.系统调用的0/1/2

  • open返回值这个整数是什么❓
  • 查看下文件描述符☞形成了文件,打印的文件描述符是3/4/5/6
  • open的返回值是3/4/5/6,为什么呢❓正常情况下,打开失败,返回值是<= -1的,怎么不见0/1/2呢❓
  • 我们自己的打开普通文件描述符是从3/4/5/6开始,可见0/1/2是已经被打开且占用了。
  • 0/1/2是系统启动时自动默认给我们打开得三个设备文件。
  • 0:标准输入,键盘。
  • 1:标准输出,显示器。
  • 2:标准错误,显示器。

3.C语言的stdin/stdout/stderr

  • 在C语言当中,也默认自动会打开三个输入输出文件流。(FILE*类型的文件流)它们三个所对应的类型都是FILE*类型。
  • C语言中的fopen文件打开操作中的返回值类型是一样的☞FILE*类型。
  • man 3 fopen
  • man 3 stdin
  • man 3 fprintf
  • extern FILE *stdin;
  • extern FILE *stdout;
  • extern FILE *stderr;
  • C语言中也可以使用fpirnt来打印(传参是文件流FILE*类型),不仅仅可以使用printf。
  • 数据刷新,也可以使用stdout文件流。

4.系统调用的0/1/2和C语言的stdin/stout/stderr二者的关系❓

  • 无论是在linux当中还是C语言当中,都是把键盘/显示器等当成文件来看待的。
  • 如果想要对键盘/显示器进行操作。可以使用C语言中的stdin,stdout等(fprintf),也可以使用系统调用中中的0/1/2(write)。
  • 系统会给我们打开三个设备文件,C语言也会默认给我们打开三个文件流。
  • 系统和语言二者存在怎样的关系呢❓
  • ❓我们并不知道C语言如何使三个文件流打开,一定是类似fopen的接口。

5.文件描述表

5.1 文件描述符概念

  • 系统调用:1:标准输出,显示器。(为例)
  • 系统调用接口write向指定的文件描述符(数字fd)写入,就是往一个指定的文件写入。
  • 类似使用C语言的printf 和 fprintf 往stdout 打印数据。直接使用系统调用接口,往显示器文件所代表的文件描述符1打印。
  • 显示器文件设备不用打开,是程序启动时默认打开的。
  • man 2 write
  • 像正常合法的0123456的连续的小整数被称为 文件描述符

  • ❓怎么理解write向一个整数里面写入,就相当于向文件里面写呢。

  • ❓fd的本质是什么

5.3 文件对象strcut file

  • 系统调用是OS给用户提供的接口。程序运行起来,才能把文件打开,才能文件操作。
  • 研究打开文件(文件操作)本质是:研究进程和文件的关系。
  • 程序必须启动起来,成为在OS中的进程,执行到open打开文件代码,文件才被打开。
  • 一个进程可以打开多个文件,OS当中有很多进程,对应打开很多文件。
  • OS当中一定会存在非常多的被打开的文件。(没有打开的文件在磁盘中),OS对内核中被打开的文件,必须要管理❗
  • 管理:先描述再组织
  • 描述:OS必须为被打开的文件,创建对应的内核数据结构struct file ☞源码
  • struct file一般都包含的是文件的属性(权限/打开方式/标记位等等)
  • 组织:OS会创建非常多的struct file内核数据结构,同时把每个被打开文件的struct file以双链表的形式联系起来。形成双链表。OS对文件的管理,转化成为对双链表的增删查改。

strcut file

  • struct file 里面会包含一个指针,指针指向一段 系统与该文件对应的内核级的缓存(OS给每个被打开的文件申请的一段内存)
  • 文件=内容+属性
  • 使用磁盘文件的属性 初始化 在OS中被打开的文件的struct file
  • 使用磁盘文件的内容 加载 在OS中被打开的文件的内核级缓存中(想读直接读,想写就写入,最后再刷新到磁盘即可)

5.4 进程和文件对应关系

  • OS存在很多进程task_struct,也存在很多被打开的文件struct file❓哪个进程对应哪个被打开的文件。
  • OS是把所有打开文件管理在一起的
  • 进程 : 文件 = 1:n
  • 一定要能表征进程和它打开文件之间的对应关系。OS必须建立进程和文件的关系。

  • OS在进程PCB(task_struct)中存在一个属性指针struct files_struct *files
  • 结构体对象 struct files_struct 是一种数据结构
  • 在struct files_struct结构体内部存在 一个指针数组 struct file* fd_arry[N] 
  • 指针数组就存在数组的下表:0/1/2.....
  • 指针数组 struct file* fd_arry[N] 的每个数组下表对应的数组元素(指针)指向文件结构体对象  struct file
  • 进程和对应打开的文件建立联系:只需要把描述该文件的 结构体变量 的地址填入指针数组即可
  • 文件描述符fd本质:内核的进程和文件映射关系的数据下标❗
  • 以上看☞源码证明

综上所述:一个进程想要找到对应被打开的文件,只需要把该文件 对应的 指针数组元素的下标拿到手即可。返回这个指针数组的下标给上层用户,拿到下标就可以对这个文件进行文件操作。

5.5 文件描述符理解

  • 文件描述符fd本质:内核的进程和文件映射关系的数据下标❗
  • man 2 open
  • man 2 write
  • man 2 read
  • man 2 close

写的流程

  • 首先通过open拿到文件描述符(下标),使用write/close/read等系统调用接口文件操作。
  • 在使用系统调用接口的时候,都必须传入fd参数。
  • OS拿到fd,就知道用户要访问当前进程的哪个下标了,就根据下标找到文件。
  • 把用户级缓冲区的数据,拷贝到对应文件的内核级缓存当中。
  • 最后由OS定时刷新到外设磁盘当中,完成一次文件的写入。

5.6 源码查看 

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

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

相关文章

谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集

文章目录 一&#xff0c;拖拽后结点的parentCid的更新二&#xff0c;拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三&#xff0c;拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…

mysql特殊字符、生僻字存储设置

mysql utf-8模式下&#xff0c;分为ut8mb3,utf8mb4&#xff0c;mb4是支持特殊字符、emoji表情的&#xff0c;mb3是不支持的。 报错信息&#xff1a; 1### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\xA8\x92\x82\xE6\x95... fo…

MongoDB教程(二十):MongoDB正则表达式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、正则表…

【ESP32 idf 硬件I2C驱动MPU6050获取六轴数值】

目录 I2C介绍配置安装驱动通信创建&删除命令链接容器起始时序写数据读数据结束时序开始命令 mpu6050 硬件i2c驱动代码&调试代码调试 I2C 介绍 介绍部分可以看我写的【ESP32 idf 软件模拟I2C驱动MPU6050实现六轴加速度的获取】&#xff0c;这个是使用软件模拟的I2C时序…

python在类中手动定义标准化输出函数

在深度学习等训练框架中&#xff0c;有时候需要对模型的名称、参数量、训练进度、中间结果等进行标准化输出&#xff0c;从而方便实时查看代码运行情况&#xff0c;这时&#xff0c;可以在类中手动定义如下标准化的输出函数&#xff0c;然后在需要输出的地方进行调用即可。 首…

鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程

开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…

linux怎么创建python

第一步&#xff0c;创建一个test文件夹。 第二步&#xff0c;打开终端进入该文件。 第三步&#xff0c;vim test.py。 第四步&#xff0c;编写代码。 第五步&#xff0c;编辑好之后&#xff0c;按Esc键切换到命令模式&#xff0c;然后输入:wq&#xff0c;再按回车键即可自动保存…

探索 SPL-404 协议标准:NFT 与 DeFi 的融合

在快速发展的数字资产领域中&#xff0c;NFT 协议标准持续演变&#xff0c;改变了我们对数字所有权和互动方式的理解。从 Art 到 Gamefi 等等&#xff0c;NFT 已经演变成数字经济的重要组成部分&#xff0c;吸引了广泛关注。遵循 ERC404 协议&#xff0c;SPL404 概念在 Solana …

AvaloniaUI的学习

相关网站 github:https://github.com/AvaloniaUI/Avalonia 官方中文文档&#xff1a;https://docs.avaloniaui.net/zh-Hans/docs/welcome IDE选择 VS2022VSCodeRider 以上三种我都尝试过&#xff0c;体验Rider最好。VS2022的提示功能不好&#xff0c;VSCode太慢&#xff0c…

flex/lex使用和学习

flex/lex用于生成解析配置文件的C代码&#xff0c;我们可以不用自己手动去做解析的工作&#xff0c;交由他们生成的代码去做。 假设&#xff0c;我有如下一个配置文件config.xml 配置文件中定义了三种channel,分别为SSIF, IPMB, NET&#xff0c;每一种channel都有4个int属性&a…

生成式AI:对话系统(Chat)与自主代理(Agent)的和谐共舞

生成式AI&#xff1a;对话与行动的和谐共舞 我们正站在一个令人激动的时代门槛上——生成式AI技术飞速发展&#xff0c;带来了无限的可能性。一个关键问题浮现&#xff1a;AI的未来是对话系统&#xff08;Chat&#xff09;的天下&#xff0c;还是自主代理&#xff08;Agent&am…

实时同步:使用 Canal 和 Kafka 解决 MySQL 与缓存的数据一致性问题

目录 1. 准备工作 2. 将需要缓存的数据存储 Redis 3. 监听 canal 存储在 Kafka Topic 中数据 1. 准备工作 1. 开启并配置MySQL的 BinLog&#xff08;MySQL 8.0 默认开启&#xff09; 修改配置&#xff1a;C:\ProgramData\MySQL\MySQL Server 8.0\my.ini log-bin"HELO…

【Git】merge合并分支

两个分支未修改同一个文件的同一处位置: Git自动合并 两个分支修改了同一个文件的同一处位置:产生冲突 例&#xff1a; 在master分支修改了main同时&#xff0c;feat分支也修改了相同的文件 合并的时候就会产生冲突 解决方法: Step1- 手工修改冲突文件&#xff0c;合并冲突内容…

立仪光谱共焦传感器应用测量之:汽车连接器高度差测量

01 检测要求&#xff0c;要求测量汽车连接器的高度差 02 检测方式 根据观察&#xff0c;我们采用立仪科技光谱共焦H4UC控制器搭配D65A52系列镜头&#xff0c;角度最大&#xff0c;外径最大&#xff0c;量程大&#xff0c;可以有效应用于测量弧面&#xff0c;大角度面等零件。 0…

会员信息管理系统-计算机毕业设计源码38258

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3开发技术 1.3.1 Spring Boot框架 1.3.2 Java语言 1.3.3 MySQL数据库 1.4论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统功能分析 2.4 系统用例分析…

视频去水印免费电脑版 pdf压缩在线免费网页版 pdf压缩在线免费 简单工具软件详细方法步骤分享

消除视频中的恼人水印&#xff0c;是许多视频编辑爱好者的常见需求。在这篇文章中&#xff0c;我们将探讨几种视频去水印的技巧&#xff0c;在数字化时代&#xff0c;视频和图片的传播越来越方便&#xff0c;但随之而来的水印问题也让人头疼。本文将为您详细介绍视频剪辑去水印…

Web开发:ASP.NET CORE中前端使用Ajax定时获取后端数据

一、低难度&#xff08;刷新a标签&#xff09; 1、需求 给a标签每15s刷新一次&#xff0c;显示最新的时间&#xff08;时间必须由后端获取&#xff09; 应该如何操作呢 2、代码 后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Mi…

医疗器械维修行业发展及趋势

医疗器械维修的前景是广阔的。‌ 随着医疗技术的不断发展和进步&#xff0c;‌医疗器械的种类和数量持续增加&#xff0c;‌对专业维修人员的需求也在不断上升。‌无论是医院、‌诊所等医疗机构&#xff0c;‌还是医疗器械生产企业、‌销售企业等&#xff0c;‌都需要专业的维修…

System.identityHashCode(Object obj) 和 obj.hashCode() 的区别

System.identityHashCode(Object obj) 和 obj.hashCode() 都用于获取对象的哈希码&#xff0c;但它们有显著的区别&#xff1a; System.identityHashCode(Object obj): 返回对象的默认哈希码&#xff0c;这个哈希码是基于对象的内存地址生成的&#xff0c;而不受对象的 hashC…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…