Linux——什么是文件描述符?

news2024/9/28 17:36:45

目录

前文

一,为什么有文件描述符

二,什么是文件描述符

2.1 文件操作接口

 2.2 文件描述符

 三,文件描述符的原理

四,文件描述符的分配规则


前文

本文主要是详解一下文件描述符,我们从1.为什么?2.是什么?3.实现原理三个方面来解释。

一,为什么有文件描述符

在语言和系统的学习中,IO流的学习是绕不开的,在其中我们会学到文件的打开,关闭,读取,写入等操作,而在这里面当文件被系统打开后,要怎么管理这些打开的文件呢?这时候就需要用到文件描述符来管理这些被打开的文件。

二,什么是文件描述符

2.1 文件操作接口

首先在C语言的库中有一系列的文件操作函数,如fopen(打开),fclose(关闭),fputs(写入),fgets(读取),众所周知语言层面的库是通过封装操作系统提供的接口来完成底层硬件的操作,而C语言的文件操作函数也不例外,其对应的底层接口分别是open(打开),close(关闭),write(写入),read(读取)

 

 2.2 文件描述符

 细心的同学一个已经放下,在上面的系统接口中,我用红线将变量fd标注出来,其实这就是文件描述符,在我们调用open打开文件或者新建文件后,系统会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

文件描述符在形式上是一个非负整数。实际上,它是一个数组下标,指向系统为每一个进程所维护的该进程打开文件的文件描述符表。

接下来我们来写一个简单的代码来观察一下文件描述符:

这里我们发现我们只开了一个文件,但是文件操作符却是3,而不是0,1,2,这是为什么呢? 首先在Linux中我们要理解一切皆文件的第一要义,而从键盘输入,从显示器输出,其实也是打开对应的设备文件进行输入输出,即stdin,stdout,以及错误输出stderr,这三个分别称为标准输入,标准输出,标准错误,这三个默认的文件操作符分别是0,1,2。

 三,文件描述符的原理

 首先用户创建一个进程,我们创建一个进程结构task_struct来表示进程的属性,其中有一个File指针指向files_struct,其中存储这文件描述符表arr[],当我们打开文件时,会在内存中创建一个file_struct来存储每个打开文件的属性,然后这些file_struct按照文件描述符的规则再一一映射到文件描述符表arr[]中,因此当我们想修改或者读取log.txt文件时,就是通过log.txt的文件描述符在文件描述符表arr[]中找到其对应的file_struct结构体指针,然后对文件进行访问。

四,文件描述符的分配规则

规则:在file_struct中从小到大找到找到一个没有被使用的下标,作为新的文件描述符。

我们可以写一段代码来证明一下。

 观察上图我们发现,当我们关闭0也就是stdin文件时,新开文件的文件描述符会从0下标开始

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

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

相关文章

SpringBoot——原理(自动配置_案例(自定义阿里云文件上starter))

starter定义 starter就是springboot中的起步依赖,虽然springboot已经提供了很多的起步依赖,但是在实际项目开发中可能会用到和第三方的技术,不是所有第三方在springboot中都有收录。 比如之前文章中有用到过的阿里云OSS,阿里云并…

chatgpt赋能python:**Python中的SEO:正确与错误**

Python中的SEO:正确与错误 对于任何一个网站,无论其大小和规模,搜索引擎优化(SEO)都是必不可少的。作为一种流行的编程语言,Python也可以用来优化和改进SEO操作。在本文中,我们将探讨Python中对于SEO的正确和错误使用…

[笔记]C++并发编程实战 《三》线程间共享数据

文章目录 前言第3章 线程间共享数据3.1 共享数据带来的问题3.1.1 条件竞争3.1.2 避免恶性条件竞争 3.2 使用互斥量保护共享数据3.2.1 C中使用互斥量3.2.2 用代码来保护共享数据3.2.3 定位接口间的条件竞争选项1: 传入一个引用选项2:无异常抛出的拷贝构造…

vuex最详细笔记总结,这些东西你真的了解吗?

1.vuex是啥? 简单来说就是管理数据的,相当于一个仓库,里面存放着各种需要共享的数据,所有组件都可以拿到里面的数据 2.什么时候使用vuex 1.多个组件依赖于同一状态 2.来自不同组件的行为需要变更同一状态 总之,就是vuex作为一个仓库,任何组件…

和ChatGPT关于Swing music的一场对话(下篇)

昨天无意中刷到的系统推送的文章 点进去一看,原来介绍的就是老苏为了抛砖引玉编的 Swing music 的镜像,动作真是快啊。 坦白的说,文章比老苏写的好,所以让我纠结了好一阵子,本文我是发呢还是不发呢?不过似…

jQuery实现响应式瀑布流效果(jQuery+flex)

瀑布流原理:是一种常见的网页布局方式,它的特点是将内容以多列的形式呈现,每一列的内容高度不固定,根据内容的大小自适应调整,从而形成了像瀑布一样的流动效果。 瀑布流的实现原理涉及到数据加载、布局设计、图片加载和…

ML算法——KNN随笔【全国科技工作者日创作】【机器学习】

9、K-Nearest Neighbors (KNN) 9.1、理论部分 K最邻近算法 把一个物体表示成向量【特征工程】,且 KNN 需要考虑 【特征缩放】。标记每个物体的标签计算两个物体之间的距离/相似度选择合适的 K 未知点的判断基于已知点的距离,选出最近的K个点,投票选出…

pyjail初了解

前言 最近在各种比赛Misc方向都能多多小小看到Python jail题,通过eval或者exec等函数执行Python的代码获取shell,实现Python逃逸,但是我不是太会,因此找点题目做一下,总结一下。 常用Python的魔术方法 _init_:用于P…

chatgpt赋能python:Python中小数点保留的几种方法

Python中小数点保留的几种方法 作为一名Python工程师,我们经常需要对数字进行处理。在处理时,我们需要将数字进行格式化,例如保留小数点后几位或添加千位分隔符等。其中,保留小数点后几位是比较常见的需求。本文将介绍Python中小…

chatgpt赋能Python-python中怎么安装aip

概述 在现代的SEO中,使用机器学习和自然语言处理的API来分析关键字和网页内容已经成为一个普遍的实践。Google API是其中最受欢迎的一个,因为它可以提供多种功能,包括分析关键字、分析文本和图像识别等。 Python作为一种优秀的脚本语言&…

Linux Apache 配置与应用 【虚拟主机 连接保持 日志分割 分析系统 优化网页】

--------构建虚拟 Web 主机-------- 虚拟Web主机指的是在同一台服务器中运行多个Web站点,其中每一个站点实际上并不独立占用整个服务器,因此被称为“虚拟”Web 主机。通过虚拟 Web 主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建…

《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记

写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理…

chatgpt赋能python:Python合并函数:一个简单但有用的工具

Python合并函数:一个简单但有用的工具 Python是一种优雅而强大的编程语言,拥有许多内置的函数和库,可以让编程变得更加简单和高效。其中,合并函数是一个非常有用的工具,它可以让我们快速而灵活地合并和处理数据。 什…

5月30日第壹简报,星期二,农历四月十二

5月30日第壹简报,星期二,农历四月十二坚持阅读,静待花开1. 比亚迪:自主研发了常压油箱的燃油蒸汽排放控制技术,能符合蒸发排放法规标准, 愿与所有同行共享核心技术专利。2. 中国计划2030年前实现首次登月&a…

chatgpt赋能python:Python中升序和降序排序:什么是升序和降序以及如何使用Python进行排序

Python中升序和降序排序:什么是升序和降序以及如何使用Python进行排序 介绍 Python是一种强大的编程语言,可以用来处理各种类型的数据。其中包括对数据进行排序,Python具有方便且易于使用的排序功能。在Python中,可以使用升序和…

chatgpt赋能python:Python中可迭代对象的介绍

Python中可迭代对象的介绍 Python是一种高级编程语言,它具有简单易学、可读性强、功能强大等特点,成为了数据科学、机器学习、Web开发等领域的热门选择。Python中有很多重要的概念和功能,其中之一就是支持可迭代对象的概念。 在Python中&am…

chatgpt赋能python:Python中如何生成表格

Python中如何生成表格 在数据分析和处理中,表格是一种常见的数据格式,并且在不同的场景下都有着不同的用途。Python作为一种高效的编程语言,可以帮助我们轻松地生成和操作表格数据。在本文中,我们将介绍Python中生成表格的方法&a…

IDEA控制台tomcat 乱码

问题 IDEA控制台tomcat 乱码 详细问题 项目部署至tomcat上,启动tomcat,IDEA控制台终端Server日志,Tomcat Localhost日志,Tomcat Catalina日志乱码 Server日志 D:\tomcat9\bin\catalina.bat run [2023-05-29 11:20:24,521] Art…

【Linux】在Ubuntu中卸载、下载mysql以及如何检查mysql是否卸载成功

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

5.30黄金空头能否延续?今日多空如何布局?

近期有哪些消息面影响黄金走势?今日黄金多空该如何研判? ​黄金消息面解析:周一(5月29日)进入欧市盘中,对美国周末达成债务上限协议的乐观情绪推动风险情绪回升,与此同时,上周公布的美国PCE数据让美联储难…