Linux 文件描述符

news2024/11/16 17:57:39

Linux 文件描述符

Linux 中一切皆文件,比如 C++ 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。

一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)。

文件描述符(FD: File Descriptor)

在 Linux 操作系统中,当一个应用程序或进程操作系统资源时,首先会触发文件调用事件,通过应用程序或进程发送一个调用文件的信号给操作系统内核内核会在 打开文件表 中增加一条记录,同时将打开文件表中新增的记录返回给应用程序或进程,而应用程序或进程接收到来自内核返回的信息,称为 文件描述符(file desrciption)

当我们打开文件时,操作系统在内存中要**创建相应的数据结构来描述目标文件file struct,表示一个已经打开的文件对象**)。而进程执行open系统调用,必须让进程和文件关联起来。每个进程都有一个指针 *files 保存在进程控制块PCB中 , 它指向一张表 files_struct

files_struct表包含一个指针数组,每个元素都是一个指向打开文件的指针。本质上,文件描述符就是该数组的下标。所以,只要获取到文件描述符,就可以找到对应的文件。

img

文件描述符是一个简单的非负整数,用来表明每一个被进程锁打开的文件,实际上,通过 内核 返回的文件描述符正是 打开文件表 中该文件的索引记录,是一个非负整数。文件描述符 通常从 3 开始记录。

在Linux操作系统上,每个进程都有三个标准的 「POSIX」文件描述符,对应三个标准流,按照索引以 0 开始,分别是 Standard Input(标准输入)Standard Output(标准输出)Standard Error(标准错误)

文件调用流程

一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table)记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件

除了文件描述符表,系统还需要维护另外两张表:

  • 打开文件表(Open file table)
  • i-node 表(i-node table)

文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示:

img

通过文件描述符,可以找到文件指针,从而进入打开文件表。该表存储了以下信息:

  • 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
  • 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
  • i-node 表指针

然而,要想真正读写文件,还得通过打开文件表的 i-node 指针进入 i-node 表,该表包含了诸如以下的信息:

  • 文件类型,例如常规文件、套接字或 FIFO。
  • 文件大小
  • 时间戳,比如创建时间、更新时间。
  • 文件锁

对上图的进一步说明:

  • 在进程 A 中,文件描述符 1 和 20 都指向了同一个打开文件表项,标号为 23(指向了打开文件表中下标为 23 的数组元素),这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个文件多次调用了 open() 函数形成的。
  • 进程 A 的文件描述符 2 和进程 B 的文件描述符 2 都指向了同一个文件,这可能是在调用 fork() 后出现的(即进程 A、B 是父子进程关系),或者是不同的进程独自去调用 open() 函数打开了同一个文件,此时进程内部的描述符正好分配到与其他进程打开该文件的描述符一样。
  • 进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件表项,但这些表项均指向 i-node 表的同一个条目(标号为 1976);换言之,它们指向了同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了 open() 调用。同一个进程两次打开同一个文件,也会发生类似情况。

有了以上对文件描述符的认知,我们很容易理解以下情形:

  • 同一个进程的不同文件描述符可以指向同一个文件;
  • 不同进程可以拥有相同的文件描述符;
  • 不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);
  • 不同进程的不同文件描述符也可以指向同一个文件。

参考文献

[1]: Linux文件描述符到底是什么?

[2]: 什么是文件描述符?

[3]: 文件描述符

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

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

相关文章

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容: 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象,着重进行51单片机控制系统的设计研究和如…

天梯赛 L3-025 那就别担心了

原题链接: PTA | 程序设计类实验辅助教学平台 题目描述: 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结…

DHCP的原理和配置

DHCP在一个广播域里动态修改IP地址 背景 DHCP (Dynamic Host Configuration Protocol,动态主机配置协议)由Internet工作任务小组设计开发专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议 使用DHCP的好处 减少管理员的工作量避免输入错误的可能避免IP地…

Java每日一练(20230421)

目录 1. 整数排列 🌟 2. 数组排序 🌟 3. 单词搜索 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 整数排列 十位数的所有排列…

jmeter的界面介绍

前言 jmeter是一款进行接口自动化,性能测试的开源的工具 界面 jmeter菜单里面有个文件--模板,这个主要是一些请求不知道怎么设置时可以选择预制的一些模板 选择对应的模板点击创建,就可以生成一个对应的记录,我们选择jdbc&…

2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖,也是中国第二大湖,它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响,鄱阳湖湿地退化严重,同时使鄱阳湖的容量减少&…

C语言中static的作用

在 C语言 中,static 通常用来修饰变量和函数。 static 修饰变量 变量按照作用域不同,分为全局变量和局部变量。 当static修饰全局变量时,该变量仍然可以在该文件的全局区域内引用,并且在编译阶段时为该变量分配内存,…

Ubuntu 安装 Samba 服务器

1. Ubuntu 安装 Samba 服务器 确认安装: dpkg -l | grep samba 安装: sudo apt-get install samba samba-common 卸载: sudo apt-get autoremove samba2. Samba 服务器配置 sudo vi /etc/samba/smb.conf在文件最后添加 [Share] commentThis is samba …

Leetcode-day3【215】数组中的第K个最大元素

文章目录 215. 数组中的第K个最大元素题目解题思路解题思路【学习】基于快速排序的选择方法 215. 数组中的第K个最大元素 题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素&#…

osg实现地球并在指定经纬度放置一个飞机模型(非osgEarth方式)

代码如下&#xff1a; #include<osgViewer/Viewer> #include<osgGA/TrackBallManipulator> #include<osg/Shape> #include<osg/ShapeDrawable> #include<osg/Texture2D> #include<osgDB/readFile> #include<osg/MatrixTransform> #…

Linux环境对Nginx开源版源码下载、编译、安装、开机自启

一、准备内容Centos8安装yum源https://blog.csdn.net/xiaochenXIHUA/article/details/127251704?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168197299116800211534092%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%

网络安全与攻防-同源策略

目录 同源策略&#xff08;浏览器控制&#xff09; 定义 思考&#xff1a; 跨域的N种方法 Jsonp 跨域资源共用&#xff08;CORS&#xff09; 预检&#xff08;OPTIONS请求&#xff09; 代理服务&#xff08;优先考虑&#xff09; 实战CORS&#xff08;Fetchnode.js&…

利用校正板对无人机影像辐射校正

无人机影像上获取到的数据是反映传感器对光响应的数值特征&#xff08;即DN值&#xff09;&#xff0c;但DN值与环境光强及相机参数有关&#xff0c;只有将其转换为反射率才能较好的反映地物的特征。一般的转换方法是使用二向反射率已知的校正板进行「单点比值」&#xff08;只…

WINNER电比例插装阀放大器

WINNER插装阀分类&#xff1a;双向流量控制阀、提动轴型单向止回常闭比例流量阀、双向流量控制常开比例压力补偿、导压级比例泄压阀、直动型降压比例泄压阀&#xff1b; 比例控制阀是一种按输入的电信号连续、按比例地控制液压系统的流量、压力和 方向的控制阀&#xff0c;其输…

SpringBoot项目的创建和使用

目录 一&#xff0c;SpringBoot 1&#xff0c;什么是SpringBoot 2&#xff0c;SpringBoot的优点 二&#xff0c;SpringBoot项目的创建和使用 1&#xff0c;项目的创建 创建方式 使用Idea创建(统一使用Idea社区版2021.x版本) 使用网页版创建&#xff08;使用Spring官网&a…

(已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题

已解决&#xff0c;使用关键词进行百度搜索&#xff0c;然后爬取搜索结果&#xff0c;请求数据后&#xff0c;返回的是百度安全验证&#xff0c;网络不给力&#xff0c;请稍后重试。无法请求到正确数据。且尝试在header中增加Accept参数还是不行。 一、问题产生的现象 在学习过…

2024年江苏专转本到底多难?

相比较普通高考的难度来说&#xff0c;专转本的难度不算大且录取率更高一点。所以只要好好复习&#xff0c;上岸还是很容易的。&#xff08;一&#xff09;、语文的难度分析对比2022年及2023年语文的考试情况&#xff0c;考试的难度差别不大&#xff0c;也就是说语文的难度整体…

生产区域人数超员识别监测算法 yolov5

生产区域人数超员监控报警系统通过yolov5python网络模型分析技术&#xff0c;生产区域人数超员识别监测算法模型识别到现场画面区域超员时&#xff0c;立即告知后台中心进行告警提醒及时处理。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;…

C++初阶(初识命名空间及输入输出)

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式 等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标: 1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不合理的地方…

spring boot3.0新特性Http客户端远程调用

1、安装依赖 <!-- For reactive support --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>2、项目结构 3、新建配置类WebConfig package com.exa…