Linux文件描述符和打开文件之间的关系

news2024/12/22 19:02:56

简介

文件描述符和打开的文件之间似乎呈现出一一对应的关系。然而,实际并非如此。多个文件描述符指向同一打开文件,这既有可能,也属必要。这些文件描述符可在相同或不同的进程中打开。

要理解具体情况如何,需要查看由内核维护的 3 个数据结构。

  • 进程级的文件描述符表。
  • 系统级的打开文件表。
  • 文件系统的 i-node 表。

1.进程级的文件描述符表。

针对每个进程,内核为其维护打开文件的描述符表。该表的每一条目都记录了单个文件描述符的相关信息,如下所示。

  • 控制文件描述符操作的一组标志。
  • 对打开文件句柄的引用。

2.系统级的打开文件表。

内核对所有打开的文件维护有一个系统级的描述表格。有时,也称之为打开文件表,并将表中各条目称为打开文件句柄。一个打开文件句柄存储了与一个打开文件相关的全部信息,如下所示。

  • 当前文件偏移量(调用 read()和 write()时更新,或使用 lseek()直接修改)。
  • 打开文件时所使用的状态标志(即,open()的 flags 参数)。
  • 文件访问模式(如调用 open()时所设置的只读模式、只写模式或读写模式)。
  • 与信号驱动 I/O 相关的设置
  • 对该文件 i-node 对象的引用。

3.文件系统的 i-node 表。

每个文件系统都会为驻留其上的所有文件建立一个 i-node 表。第 14 章将详细讨论 i-node 结构和文件系统的总体结构。这里只是列出每个文件的 i-node 信息,具体如下。

  • 文件类型(例如,常规文件、套接字或 FIFO)和访问权限。
  • 一个指针,指向该文件所持有的锁的列表。
  • 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳。

此处将忽略 i-node 在磁盘和内存中的表示差异。磁盘上的 i-node 记录了文件的固有属性,诸如:文件类型、访问权限和时间戳。访问一个文件时,会在内存中为 i-node 创建一个副本,其中记录了引用该 i-node 的打开文件句柄数量以及该 i-node 所在设备的主、从设备号,还包括一些打开文件时与文件相关的临时属性,例如:文件锁。

图文细嗦

image-20231024210621670

​ 上图展示了文件描述符、打开的文件句柄以及 i-node 之间的关系。在下图中,两个进程拥有诸多打开的文件描述符。

在进程 A 中,文件描述符 1 和 20 都指向同一个打开的文件句柄(标号为 23)。这可能是通过调用 dup()、dup2()或 fcntl()而形成的

​ 进程A的文件描述符2和进程B的文件描述符2都指向同一个打开的文件句柄(标号为73)。这种情形可能在调用 fork()后出现(即,进程 A 与进程 B 之间是父子关系),或者当某进程通过UNIX 域套接字将一个打开的文件描述符传递给另一进程时,也会发生

​ 此外,进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件句柄,但这些句柄均指向 i-node 表中的相同条目(1976),换言之,指向同一文件。发生这种情况是因为每个进程各自对同一文件发起了 open()调用。同一个进程两次打开同一文件,也会发生类似情况。

总结

上述讨论揭示出如下要点。

  • 两个不同的文件描述符,若指向同一打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用 read()、write()或 lseek() 所致),那么从另一文件描述符中也会观察到这一变化。无论这两个文件描述符分属于不同进程,还是同属于一个进程,情况都是如此。
  • 要获取和修改打开的文件标志(例如,O_APPEND、O_NONBLOCK 和 O_ASYNC),可执行 fcntl()的 F_GETFL 和 F_SETFL 操作,其对作用域的约束与上一条颇为类似。
  • 相形之下,文件描述符标志(亦即,close-on-exec 标志)为进程和文件描述符所私有。对这一标志的修改将不会影响同一进程或不同进程中的其他文件描述符。

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

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

相关文章

安防监控项目---环境配置

文章目录 前言一、硬件平台二、软件平台三、开发环境配置流程总结 前言 书接上期,在这里呢还是需要强调一下项目环境的重要性,不论是在本次项目开发或者是在未来的项目开发中移植是非常重要的一项内容,作为开发者而言,需要考虑移…

拒绝拖延,从我做起!

拒绝拖延,从我做起! 如果有一件事,对你的未来很重要,千万不要说等以后再做,这是无限拖延的借口【等有时间再做】的真正含义是,闲得无聊再去做,意味着事情即不重要也不紧急该做的重要事情不做&a…

Qt扫盲-QFontInfo理论

QFontInfo理论 一、概述二、创建QFontInfo对象 一、概述 QFontInfo类提供了关于字体的一般信息,包括是否是加粗、是否是斜体、字体大小、字体名称等等,使用也非常简单,其实就是一个属性查询类而已。 QFontInfo类提供了与QFont相同的访问函数…

交叉熵函数和KL散度函数

交叉熵函数(Cross-Entropy Function)和KL散度函数(Kullback-Leibler Divergence Function)都是用来度量两个概率分布之间的差异或相似性的数学函数。它们通常用于概率分布的比较,尤其在信息论和机器学习领域中。 交叉熵…

海南三亚摩托车三维扫描尺寸测绘机车零配件改装逆向抄数3D打印手板-CASAIM

在摩托车制造过程中,摩托车的曲面多,尺寸大,传统的测量方式通过千分尺及三坐标测量仪进行测量,存在部分位置无法精确测量和效率相对比较低等问题,难以快速完成大尺寸结构复杂的零部件三维数据重建。 而借助CASAIM三维…

49个过程背诵方法

五大过程组:启规执监收 需要死记住,五个比较好记按照顺序启动规划执行监控结束 十大过程:整范进,成质源,疯(风)狗(沟)踩(采)人 过程数量&#x…

在线客服系统源码全端通吃版+完全开源可二开 带完整搭建教程

随着互联网的快速发展,在线客服系统已经成为企业与客户沟通的重要工具。然而,市面上的在线客服系统往往存在限制多、成本高等问题。今天罗峰给大家介绍一种在线客服系统源码全端通吃版,并附带完整的搭建教程。 在线客服系统源码可以为企业提供…

电脑自动关机是什么原因?解决方案全解析!

电脑自动关机是一个令人头疼的问题,它可能由多种原因引起,从硬件故障到软件配置错误。在这篇文章中,我们将深入探讨电脑自动关机是什么原因,并提供三种常见问题的解决方法。无论您是电脑新手还是有经验的用户,都可以从…

Cesium 展示——一键控制所有 label 的显隐

文章目录 需求分析需求 实现一键控制所有 label 的显隐 分析 步骤如下: 获取场景中所有的实体(entities)。 遍历所有实体,获取实体中的label对象。 设置 label 的 show 属性为 false 或 true,以控制其显隐。 具体实现代码如下: var entities = viewer.entities; //…

UE4 使用材质后期 制作玻璃有雨效果

效果展示,其实这是一个动画效果 以上为所有逻辑 拿到TexCoord给到Panner,Time和Speed都是通过下面计算而来,后面讲,再拿到时间和速度值过后,加上扰动值,最后取G值,因为雨事从上而下的动&#xf…

1465. 切割后面积最大的蛋糕 : 为何仅需处理相邻切割位(多语言题解)

题目描述 这是 LeetCode 上的 「1465. 切割后面积最大的蛋糕」 ,难度为 「中等」。 Tag : 「贪心」、「模拟」 矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts,其中: horizontalCuts[i] 是从矩形…

JAVA知识框架及技术

Web应用,最常见的研发语言是Java和PHP。 后端服务,最常见的研发语言是Java和C/C。 大数据,最常见的研发语言是Java和Python。 可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术…

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一,拥有数十亿的全球用户。它的主要产品包括Facebook(面向个人用户的社交媒体平台)、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一,其广告平台吸引了数百万广…

2023年最受欢迎的11个UI设计师网站,助你成为行业翘楚

作为一名优秀的UI设计师,快速寻找灵感,保持审美在线,了解行业动态绝对是一项职业必备技能。 今天小编为各位小伙伴整理了一些UI设计师必看的绝佳网站。你可以从这些网站中了解行业最新动态,寻找创意灵感、学习优秀作品&#xff0…

使用Python将PDF转为图片

将PDF转为图片能方便我们将文档内容上传至社交媒体平台进行分享。此外,转换为图片后,还可以对图像进行进一步的裁剪、调整大小或添加标记等操作。 用Python将PDF文件转JPG/ PNG图片可能是大家在一些项目中会遇到的需求,下面将详细介绍如何使用…

LibreOffice怎么调整标题和段落之间的间距

今天用LibreOffice创建新文档,标题和段落之间的距离太大了,浪费空间: 如果想缩小距离的话,可以进行调整。 点击右侧导航栏的“属性”图标: 光标放在标题上: 在属性窗口,点击设置行距的下…

专业140+总分400+合工大合肥工业大学833信息通信上岸分享

我初试总分400,专业833是140,对于成绩还是比较满意,希望自己的复习经验对大家有所帮助。 近年分数线情况 合工大通信近几年分数线波动较大,有些大小年倾向,今年学硕和专硕都在320分左右,但是复录比增加为…

Android 开发调试时连接手机5037端口被占用的问题解决

原理是根据端口查询pid并结束占用了5037端口的进程。 步骤: 1.使用cmd命令行查看被占用端口所对应的 PID 输入命令:netstat -aon|findstr “端口号” 现在要找到使用了5037端口的进程,那么就是netstat -aon|findstr "5037" 结…

TreeMap 源码解析

目录 一. 前言 二. 源码解析 2.1. 成员属性 2.2. 构造方法 2.3. 添加元素 2.4. 获取元素 2.5. 是否包含key 2.6. 删除元素 三. 总结 一. 前言 TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,TreeMap 的核心是红黑树…

基础课10——人工智能的基础:大数据

人工智能和大数据是相互依存、相互促进的关系。 大数据是人工智能的重要基础,没有大数据,人工智能就难以发挥其作用。同时,人工智能也提供了处理和分析大数据的工具和方法,使得大数据能够得到更有效的利用。 在应用方面&#xf…