对FD描述符(包括inode以及三张表)的一点理解

news2025/7/17 22:10:02

文件描述符,简单来说是一个从0开始递增的非负整数。

具体来说是linux/unix对文件系统的一种底层抽象,这种抽象是通过三张表来实现的。

这三张表分别是:

1.进程级的文件描述符表;(文件标志位/文件指针)

2.系统级的打开文件描述符表;(当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改) 打开文件时的标识(open()的flags参数) 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式) 与信号驱动相关的设置 对该文件i-node对象的引用,即i-node 表指针)

3.文件系统的i-node表。(文件的字节数 / 文件拥有者的User ID / 文件的Group ID / 文件的读、写、执行权限/文件的时间戳 / 链接数,即有多少文件名指向这个inode / 文件数据block的位置)

假设,现在一个linux/unix系统启动了。系统的底层储存由多个扇区组成,多个扇区组成一个块,这个块就是系统的存储的最小单元。

硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。inode就是通过定位块的位置和大小获得储存位置的定位。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

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


特殊场景分析:

如果一个进程调用了dup()、dup2()、fcntl() 等方法,或者父进程打开后关闭了文件,父进程fork的子进程又打开了该文件,就可能会出现一个进程中多个文件描述符指向同一个文件打开表的情况。(参考上图的进程A的FD1和FD20,同时指向了打开文件表23

如果进程A和进程B归属于同一个用户,进程A的FD2打开了一个文件后关闭,进程B的FD2又打开了同一个文件,就可能会出现多个进程中的文件描述符指向同一个文件打开表的情况。

(参考上图的进程A FD2和进程B FD2,同时指向了文件打开表73)

如果进程A的FD0打开了一个文件后未关闭,同时进程B的FD3又打开了同一个文件,就可能会出现多个进程的文件描述符指向不同的文件打开表,但是不同的文件打开表指向同一个inode的情况。

或者进程A和进程B归属于不同的用户,且不同用户对文件有不同的权限时,无论进程A和B同时或者不同时打开同一个文件,两个进程都会指向一个不同的文件打开表,但是不同的文件打开表又会指向同一个文件。

(参考上图的进程A FD0指向了文件打开表0,进程B的FD3指向了文件打开表86 ,但是文件打开表0和文件打开表86同时指向了inode1976)

文件描述符这种设计,是为了适应linux多用户多进程的特点。

进程级的文件描述符表赋予了多个进程同时管理一个文件的能力,系统级的文件打开表赋予了多个进程(对于多个用户对文件有不同的权限)或者同一个进程对一个文件同时操作的能力,inode表作为文件的元数据表才是物理层面的文件属性表。

可以简单理解为进程级的文件描述表为了多进程,文件打开表为了多用户,inode才是文件本身。

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

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

相关文章

Android Studio App开发之下载管理器DownloadManager中显示、轮询下载进度、利用POST上传文件讲解及实战(附源码)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、在通知栏显示下载进度 利用GET方式读取数据有很多缺点比如1:无法端点续传 一旦中途失败只能重新获取 2:不是真正意义上的下载操作 无法设置参数 3:下载过程中无法在界面上上展示下…

NAFNet(ECCV 2022)-图像修复论文解读

文章目录解决问题算法背景Simple BaselinePlain Block归一化激活函数Attention机制总结NAFNetSimpleGate替换GELUSCA替换CA总结实验应用RGB图像去噪图像去模糊RAW图像去噪结论论文: 《Simple Baselines for Image Restoration》github: https://github.com/megvii-research/NAF…

同事:这个页面的逻辑没什么能复用的,不抽组件也没什么影响吧?

前言 最近在维护同事的一个项目时,发现有不少单个vue文件一千余行,同一个文件上有倒计时、有输入信息的表单; 当时我就在想:是不是策划经常改需求或者排期紧急,所以没抽组件呢。 沟通过程 以下同事称为阿A 我&#…

【附源码】计算机毕业设计JAVA家庭理财管理系统

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

Java基础—Document类型的变化

Document类型的变化 Document类型的变化中唯一与命名空间无关的方法是importNode()。这个方法的用途是从一个文档中取得一个节点,然后将其导入到另一个文档,使其成为这个文档结构的一部分。需要注意的是,每个节点都有一个ownerDocument属性&…

G1D13-Apt论文阅读fraudgitKGbookrce33-36php环境搭建

一、APT论文 今天终于把6个模型论文和一篇综述读完了!!! 今天主要读了一篇论文写了个总表。发现之前读的论文都忘了,所以 明天要复习一下模型,记录在文档中,并完善模型对比的总表,并且把代码下…

[附源码]java毕业设计基于web的建筑合同管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

一. tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中,其中有任务状态链表和事件链表两个链表成员,首先介绍任务状态链表这个结构,这个链表通常用于管理不同状态的任务;通常,操作系统任务有…

CPU、内存、磁盘性能监控

CPU监控 网络由设备、服务器、路由器、交换机和其他网络组件组成。CPU 是网络中所有硬件设备的组成部分。它负责设备的稳定性和性能。企业严重依赖网络,企业硬件的处理能力决定了网络的容量。随着 CPU 功能和硬件的快速发展,组织必须规划其容量并监控其…

成功上岸,刚转行自学Python的小姑娘,每个月入1W+......

我是一名2020年毕业的本科生,大学学的专业是机械设计制造及其自动化。 在大学期间,觉得机械专业实在枯燥无味,没有一点点成就感,每天就是画图纸,测量零件,计算数据,一切都是纸上谈兵。但凡有因…

甲氧基PEG多巴胺DPA-mPEG,Dopamine-mPEG,PEG化的多巴胺具有良好的水溶性

英文名称:mPEG-DPA mPEG-Dopamine 中文名称:甲氧基-聚乙二醇-多巴胺 分子量:1k,2k,3.4k,5k,10k 产地:广州 品牌:为华生物 存储条件:≤-4℃低温干燥保存…

Netty-实验

Netty应用实例-群聊系统 实例要求: (1)编写一个Netty群聊系统,实现服务端和客户端之间的数据简单通讯(非阻塞) (2)实现多人群聊 (3)服务器端:可…

论文阅读笔记 | 三维目标检测——PointRCNN

如有错误,恳请指出。 文章目录1. 背景2. 网络结构2.1 Proposal Generation2.2 Proposal Refinement3. 实验部分3.1 kitti上的测评3.2 消融实验paper:《PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud》文章比较复杂&#xff…

一文详解Redis企业版软件!

一、Redis企业版软件概述 Redis企业版软件(Redis Enterprise)是企业级的数据库软件,也是一款实时数据平台,为全球超过8500家知名企业提供实时数据服务。具有线性可扩展性、高可用性、持久性、备份和恢复、地理分布、分层内存访问…

WhatsApp群发系统-SendWS拓客系统功能后台介绍(五):WhatsApp筛号群发,群发超链

WhatsApp群发系统 基于WhatsApp进行群发功能,将品牌和产品推送给全世界各地的人们或者选择筛选好的用户,进行针对性的群发,提升了品牌和产品的影响力,让更多人了解认识品牌,帮助客户低成本实现WhatsApp营销精准拓客。…

windows和linux可以共用的端口连通性是否丢包测试工具paping

通常我们在系统无论是在windows还是linux,都会使用telnet命令来测试端口的连通性,但此命令只能测试是否通,无法测试是否有丢包或者是否有中断。paping这个工具就应用而生,它可以在多系统环境下进行像ping一样测试。 一、下载&…

【vscode】远程容器内开发python

一、环境 本人的远程开发环境: docker容器miniconda 常用的IDE: pyCharm专业版vsCodeRemote Development插件Python插件 由于pyCharm专业版要么花钱要么破解,我选择了vscode插件的方式,插件都是microsoft出品。 二、使用 服务…

记一道前端高难度面试题

目录 提问:如何让下面的这行代码成立 1.错误原因 2.思路 3.解题 4.小结 提问:如何让下面的这行代码成立 var [a,b] {a:1,b:2} 直接运行会报错,报错信息如下: Uncaught TypeError: {(intermediate value)(intermediate valu…

手柄零件的工艺设计

手柄零件的工艺设计 目录 一、零件的工艺分析及生产类型的确定 1.零件的作用-------------------------------------------------------------------------- 3 2.热处理-------------------------------------------------------------------------------- 3 3.零件的生产类型-…

架构师书籍推荐

讲实话,要看书只能看看架构师思维相关的数据,开拓一下思路就行,看看别人的看法和观念。 架构师需要积累的技术不要从书上来,去官网看他的说明书,一切纯讲技术类的书籍都有滞后性。 正在用的技术要时常关注一下他官网…