Linux6.3、IO基础(文件描述符及分析系统接口细节)

个人主页:Lei宝啊 

愿所有美好如期而遇


前言

我们介绍文件描述符的顺序是:

  1. 为什么我们新打开几个文件,open返回值fd从3开始?
  2. fd与FILE*的关系?
  3. fd的理解?

我们就很疑惑,0,1,2哪里去了,为什么fd是从3开始的?

这里我们就要先了解FILE*类型,首先,我们要知道FILE是一个结构体,由C标准库所支持,并且,由此支持了FILE*类型的stdin(标准输入),stdout(标准输出),stderr(标准错误),分别对应着键盘,显示器,显示器。

我们在使用fwrite或者时fputs等文件类函数时,参数通常会有stdin,stdout,我们也应该知道,这些函数他既然能够访问硬件,那么就一定封装了系统调用,就比如fwrite封装了write,fputs封装了read,fopen封装了open,fclose封装了close。

C标准库支持的文件类函数认识FILE*,但我们的系统调用他只认识fd,并不认识FILE*,所以我们上层传入的FILE里必然封装了fd,并且在底层以FILE*->fd的方式传递给了系统调用。(我们使用fopen打开文件,返回值是FILE*类型,fopen的底层封装了open,open的返回值是fd,所以我们也就知道了FILE*类型是封装了fd的,以后其他文件类函数使用时传入FILE*底层就可以得到fd了)

那么现在我们可以揭晓答案了,stdin里封装的fd为0,stdout里封装的fd为1,stderr里封装的fd为2,进程跑起来时这三个文件是被默认打开的,所以我们再打开其他文件,fd就从3开始了。

那么fd是什么呢?

我们从头开始理解,当我们运行一个程序,想让一个进程去访问文件时,如何访问文件?首先是不是应该让文件从磁盘加载进内存中,因为根据冯诺依曼体系,一个文件要被访问执行,首先要加载进内存,然后由CPU去计算执行,那么我们的进程访问文件,只能访问一个吗?当然不是,刚才我们同时打开了多个文件,一个进程默认情况下可以打开1024个文件,那么我们多个进程同时打开多个文件是不是也可以?那么这么多的进程和文件在内存中,进程需要被操作系统管理,文件需不需要?当然需要,怎么管理?同进程一样,先描述,再组织。

也就是说,我们可以通过task_struct中arrry数组,找到所有打开的文件,现在,我们终于可以明白fd本质就是数组下标!它叫做文件描述符。

现在我们重新理解思路,当一个文件打开时,会在内存中创建struct file(包含了磁盘文件的几乎所有内容),之后将他的地址填入数组,给用户(或者说open函数)返回填入位置的下标,当我们想要找到打开的文件时,通过返回的fd就可以找到struct file,而这个结构体几乎包含了文件的所有信息!我们也就能够通过这个结构体访问这个文件,对文件进行一系列操作。

接下来我们验证FILE*对fd的封装

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

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

相关文章

2015年第四届数学建模国际赛小美赛A题飞机上的细长座椅解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 A题 飞机上的细长座椅 原题再现: 航空公司座位是指在旅途中乘客可以乘坐的座位。一些航空公司现在推出了新的经济舱“超薄”座位。这些座椅除了重量较轻外,理论上还允许航空公司在不显著影响乘客舒适度的情况下增加运…

电脑屏幕保护时间怎么设置?这4个方法很管用!

“我的工作经常都需要使用电脑,有时候使用时间比较长,会有眼睛疲惫的感觉。想问问电脑屏幕保护时间应该怎么设置呢?有什么可以快速对电脑屏幕保护时间进行设置的方法吗?” 在现代生活中,电脑已经成为我们不可或缺的工具…

L1-061:新胖子公式

题目描述 根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。 输入格式: 输入在一行中给出两个正数,依次为…

探秘Python中filter函数的妙用:高效的数据筛选利器

概要 Python作为一门易学易用的编程语言,其内置函数filter()能够帮助开发者更加高效地进行数据筛选和处理。本文将详细介绍filter函数的使用教程,帮助读者了解其原理、语法和常见应用场景,并给出一些实用的示例代码。 一、filter函数简介及原…

Java基于TCP网络编程的群聊功能

服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…

Java期末考试“大招”

目录 1.下面三者的区别 2.基本数据类型 3.变量的作用范围&#xff0c;类变量&#xff0c;实例变量。局部变量的区别 4.普通类和抽象类和内部类的区别 5.面向对象编程的三大特征 6.封装实现的过程和实现的必要性 7.子类从父类哪里继承了什么&#xff1f; 8.简述多态的实…

鸿蒙原生应用/元服务开发-Stage模型能力接口(十)上

ohos.app.form.FormExtensionAbility (FormExtensionAbility) FormExtensionAbility为卡片扩展模块&#xff0c;提供卡片创建、销毁、刷新等生命周期回调。 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接…

shell 编程中内置的变量(冷门又好用)

简介 分别盘点一下 shell 中的内置变量&#xff0c;真的巨好用&#xff01;&#xff01;&#xff01;包括&#xff1a;环境变量类、shell 变量类、终端设置类和其他一些变量。 常用的内置变量目录如下 1. 环境变量类 $MACHTYPE&#xff1a;机器类型 $OSTYPE&#xff1a;操作…

HBase深度历险 | 京东物流技术团队

简介 HBase 的全称是 Hadoop Database&#xff0c;是一个分布式的&#xff0c;可扩展&#xff0c;面向列簇的数据库&#xff0c;是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。本文会像剥洋葱一样&#xff0c;层层剥开她的心。 特点 首先我…

Jenkins Tutorial

什么是Jenkins Jenkins是一个自动化平台&#xff0c;它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先&#xff0c;你拥有一个Master Server&#xff0c;它控制pipelines和安排Build到你的Agent上&#xff1b; 其次&…

【超详细前后端项目搭建】前端vue3+ts项目(引入ElementPlus、Axios)、后端springboot搭建(创建接口操作mysql数据库)实现前后端联调

目录 前言一、前端项目1、使用vue脚手架创建项目1.1检查vue版本1.2 使用vue脚手架创建项目 2、删除项目多余文件&#xff0c;修改配置项目2.1、删除以下文件2.1、在views下创建index文件2.2、修改router/index.ts路由文件&#xff1a;2.3、修改App.vue文件&#xff1a;2.4、初始…

MySQL递归公用表表达式

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;MySQL知识 &…