【文件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://xiahunao.cn/news/3267351.html

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

相关文章

AI行业合适做必应bing推广吗?怎么开户呢?

快速发展的AI行业中&#xff0c;有效的市场获客渠道是关键&#xff0c;随着数字营销领域的不断演进&#xff0c;必应Bing以其独特的市场定位、庞大的用户基础和高效的广告系统&#xff0c;成为AI企业推广策略中的重要一环。特别是针对那些寻求精准触达、高效转化的AI企业而言&a…

C++初级学习:⼊⻔基础

本文内容&#xff1a; 1.C参考⽂档&#xff1a;2.C第一个程序3.命名空间3.1namespace的价值3.2namespace的定义3.3命名空间的使用 4.C输⼊&输出5.缺省参数6.函数重载 1.C参考⽂档&#xff1a; https://legacy.cplusplus.com/reference/ https://zh.cppreference.com/w/cp…

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…

【C++】19.红黑树模拟实现 set 和 map

我们想要实现STL中的set和map&#xff0c;那么第一步就需要看一下库函数是如何实现的&#xff1a; 通过查看源代码我们发现两个容器都包含了stl_tree.h&#xff0c;因此我们猜测此头文件实现的是红黑树。 但是set和map很显然不是使用同一棵树实现的&#xff0c;那么STL库是怎么…

C# Nmodbus,EasyModbusTCP读写操作

Nmodbus读写 两个Button控件分别为 读取和写入 分别使用控件的点击方法 ①引用第三方《NModbus4》2.1.0版本 全局 public SerialPort port new SerialPort("COM2", 9600, Parity.None, 8, (StopBits)1); ModbusSerialMaster master; public Form1() port.Open();…

Beam Search 原理详解

文章目录 1. 前言2. 原理3. 举例4. 参考 1. 前言 Beam Search 是一种启发式图搜索算法&#xff0c;用于在图或树的搜索过程中寻找最有可能的路径。它常用于自然语言处理&#xff08;NLP&#xff09;中的序列生成任务&#xff0c;如机器翻译、语音识别和文本生成等。与穷举搜索…

渲染技术如何帮助设计内容实现从平面到立体的转换

随着数字艺术和视觉特效的飞速发展&#xff0c;三维建模与渲染技术在影视、游戏、广告、工业设计、建筑可视化等多个领域展现出了其不可或缺的重要性。这一技术不仅实现了从平面到立体的跨越&#xff0c;还极大地丰富了视觉表达的层次感和真实感。 三维建模&#xff1a;构建虚…

一站式企业服务平台有哪些特点和优势!

随着我国经济的快速发展&#xff0c;各地方政府及产业园区为了能够吸引投资和优质企业入驻&#xff0c;纷纷在营商环境优化上大下功夫&#xff0c;这是因为当下企业已经不再满足于基础服务&#xff0c;而是更看重利于企业发展的软环境&#xff0c;随之建设“一站式企业服务平台…

flex/lex使用和学习

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

PyTorch基础(24)--torch.multinomial()方法

&#x1f449;torch.multinomial的源码见https://github.com/dongjinkun/PyTorch/tree/main/torch 一、前言 torch.multinomial()方法多出现在需要采样的场景中&#xff0c;如强化学习。具体讲&#xff0c;当使用强化学习解决旅行商问题时&#xff0c;针对某一个instance&…

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发&#xff08;30小时精通C和外挂实战&#xff09; 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1&#xff0c;修改内存中的数据 2&#xff0c;更改内存中…

外文文献去哪个网站查找下载又快又准

今天收到好多同学的文献求助&#xff0c;大部分都是外文文献。那么外文文献去哪里查找下载比较好呢&#xff1f;本文小编就讲解一下自己平时是在什么网站上查找获取文献的&#xff0c;下面就用几篇求助文献演示一下获取过程&#xff1a; 第一篇、OVID数据库&#xff1a;A Crit…

录音教程分享:电脑在线录音,7款录音软件免费版公开!

在我们的日常生活中&#xff0c;不可避免地会遇到需要在电脑上录制各种系统内音频的场景。无论是记录一次讲座、一段对话&#xff0c;或者录制某个重要网站上的音频&#xff0c;这种需求变得愈发重要且广泛。然而&#xff0c;对许多人来说&#xff0c;在电脑上在线录音可能是一…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础&#xff0c;开始学习微服务的同学&#xff0c;我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快&#xff0c;会记录demo演算和中间件的使用过程&#xff0c;至于细节的理论…

Spark_Oracle_II_Spark高效处理Oracle时间数据:通过JDBC桥接大数据与数据库的分析之旅

接前文背景&#xff0c; 当需要从关系型数据库&#xff08;如Oracle&#xff09;中读取数据时&#xff0c;Spark提供了JDBC连接功能&#xff0c;允许我们轻松地将数据从Oracle等数据库导入到Spark DataFrame中。然而&#xff0c;在处理时间字段时&#xff0c;可能会遇到一些挑战…

计算机网络知识-面试点1

1. 三握四挥 定义&#xff1a; 在计算机网络中&#xff0c;特别是TCP/IP协议中&#xff0c;“三握”指的是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;而“四挥”则指的是四次挥手&#xff08;Four-way Handshake&#xff09;。这两个过程分别用于TCP连接…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别&#xff1a;Hash为默认模式&#xff0c;url中包含一个#符号的哈希部分。优势&#xff1a;兼容性好&#xff0c;不需要后端服务器的特殊配置。缺点&#xff1a;不够美观&#xff0c;搜索引擎优化较差。History模式使用的浏览器的His…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

leetcode日记(55)二进制求和

将短的字符串前面补充0&#xff0c;使两字符串对其再进行加法&#xff1a; class Solution { public:string addBinary(string a, string b) {int na.size();int mb.size();if(n>m) b.insert(0,n-m,0);else if(m>n) a.insert(0,m-n,0);string c;int jw0;for(int imax(n,…

【C++指南】类和对象(上)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注