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的封装

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统编程】进程状态

介绍 进程的状态指的是进程在执行过程中所处的状态。进程的状态随着进程的执行和外界条件的变化而转换。我们可用 kill 命令来进程控制进程的状态。 kill中的 kill -l 指令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 kill 命令来向进程发送特定的信号控制其…

地图服务器GeoServer的安装与配置

文章目录 1.安装配置Java2.安装配置Tomcat3 安装配置GeoServer GeoServer提供了多种安装配置方式,但是本质上GeoServer是一个基于Java Web的项目,因此我们理论上只需要安装Java,并且将其放置在一个Web服务器(例如Apache Tomcat&am…

BioXCell--RecombiMAb anti-mouse VEGFR-2

DC101-CP132单克隆抗体是原始DC101单克隆的重组嵌合型抗体。可变结构域序列与原始DC101相同,但是恒定区序列已经从大鼠IgG1变为小鼠IgG2a。DC101-CP132单克隆抗体像原始大鼠IgG1抗体一样,不包含Fc突变。 DC101-CP132单克隆抗体能与小鼠VEGFR-2(血管内皮生…

等保测评里面,登录后,强制检测弱口令的处理流程

一张图脑补: 密码强度检查工具:https://blog.csdn.net/qq_37148232/article/details/135017666?spm1001.2014.3001.5501

目标检测-Two Stage-RCNN

文章目录 前言一、R-CNN的网络结构及步骤二、RCNN的创新点候选区域法特征提取-CNN网络 总结 前言 在前文:目标检测之序章-类别、必读论文和算法对比(实时更新)已经提到传统的目标检测算法的基本流程: 图像预处理 > 寻找候选区…

12.25

led.c #include "led.h" void all_led_init() {RCC_GPIO | (0X3<<4);//时钟使能GPIOE_MODER &(~(0X3<<20));//设置PE10输出GPIOE_MODER | (0X1<<20);//设置PE10为推挽输出GPIOE_OTYPER &(~(0x1<<10));//PE10为低速输出GPIOE_OSPEED…

虚拟机安装centos7系统步骤

1、下载系统镜像文件 下载地址&#xff1a;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso 2、鼠标右键点击虚拟机-->设置-->CD/DVDD-->使用ISO映像文件-->点击浏览&#xff0c;选择文件&#xff0c;而后保存设置 3、点…

蓝桥杯c/c++程序设计——冶炼金属

冶炼金属 问题描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0…

【STM32单片机】汉诺塔游戏

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;IIC OLED液晶、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示游戏画面&#xff0c;可通过K1或K3键选择关卡&#xff0c;K2键开始。 二…

开源分布式搜索引擎ElasticSearch结合内网穿透远程连接

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…

麒麟V10arm桌面版的安装包在麒麟V10服务器版安装

安装过后&#xff0c;可执行程序可能运行不了&#xff0c;看起来就像没识别为可执行程序。在终端运行&#xff0c;会发现其实是缺少了某些库&#xff0c;比如libicui18n.so.66、libicuuc.so.66、libicudata.so.66和libm.so.6库版本不对。 报这个错&#xff1a;error while loa…

如何使用 pnpm 实现前端 Monorepo项目管理

前言 随着软件开发项目变得越来越庞大和复杂&#xff0c;如何有效管理和维护代码库成为了一个重要的问题。一种流行的解决方案是 Monorepo&#xff0c;也就是在一个版本控制系统中管理所有的项目代码。 什么是 Monorepo Monorepo 是一种项目代码管理方式&#xff0c;指单个仓…

internet download manager 6.42怎么删除卸载,2024最新idm卸载不干净怎么解决

internet download manager 6.42简称为IDM&#xff0c;这是一款非常好用的下载软件&#xff0c;很多小伙伴都在使用。如果后续我们不再需要使用该软件&#xff0c;小伙伴们知道具体该如何将其卸载掉吗&#xff0c;其实卸载方法是非常简单的&#xff0c;只需要进行几个非常简单的…

分布式核心技术之分布式锁

文章目录 为什么要使用分布锁&#xff1f;分布式锁的三种实现方法基于数据库实现分布式锁基于缓存实现分布式锁基于 ZooKeeper 实现分布式锁知识扩展&#xff1a;如何解决分布式锁的羊群效应问题&#xff1f; 三种实现方式对比 分布式互斥&#xff0c;领悟了其“有你没我&#…

绝地反击,不做背锅侠!

那么作为运维人员&#xff0c;如何摆脱以上背黑锅的尴尬局面呢&#xff1f;堡垒机当然是破解此局面的绝杀大招。 1.统一登录入口 提供统一入口&#xff0c;集中管理和分配账户密码、所有运维人员只能登录堡垒机才能访问服务器&#xff0c;梳理“人与服务器”之间的关系&#…

新版Microsoft Edge和google chrome谁才是浏览器的王者?

Microsoft Edge是一款现代化的浏览器&#xff0c;它拥有众多功能和强大的性能&#xff0c;为用户带来更加流畅的浏览体验。 Edge最近推出了分屏功能&#xff0c;支持一个窗口同时显示两个选项卡&#xff0c;这可以大大提高生产力和多任务处理能力。 一、结合平时的使用经历&…

2024 年网络安全展望:未来是什么?

为了建立强大的网络安全计划&#xff0c;组织必须首先了解整体威胁环境不断变化的性质。 人工智能在成为安全团队的帮助之前&#xff0c;将为网络犯罪分子带来巨大的福音。 网络犯罪分子和不良行为者将受益于先进人工智能工具的广泛部署&#xff0c;然后他们的目标才能建立人…

【计算机网络】—— 奈氏准则和香农定理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 失真 - 信号的变化 ​编辑影像失真的因素&#xff1a; ​编辑信道带宽&#xff1a; 码间串扰…

使用Go语言编写基本的HTTP服务器

你是否曾经想过自己动手编写一个Web服务器&#xff1f;那种可以接收来自全世界的请求&#xff0c;然后回应一些“Hello, World!”之类的消息的服务器&#xff1f;如果你有这个想法&#xff0c;那么Go语言就是你的最佳伙伴。让我们一起踏上这段奇妙的探险之旅吧&#xff01; 首…

Docker部署Nexus Maven私服并实现远程访问Nexus界面

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定N…