iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux的文件描述符、文件指针、索引节点详情
  • 491
分享到

Linux的文件描述符、文件指针、索引节点详情

Linux的文件描述符Linux的文件指针Linux的索引节点 2022-06-04 23:06:03 491人浏览 安东尼
摘要

目录linux--文件描述符、文件指针、索引节点一、Linux —— 文件描述符1、文件描述符 Fd2、系统级的文件描述符表3、文件系统的inode表二、文件指针 *FILE三、索引节点 Inode1、Inode特殊作用

目录
  • linux--文件描述符、文件指针、索引节点
    • 一、Linux —— 文件描述符
      • 1、文件描述符 Fd
      • 2、系统级的文件描述符表
      • 3、文件系统的inode
    • 二、文件指针 *FILE
      • 三、索引节点 Inode
        • 1、Inode特殊作用
      • 四、拓展
        • 1、磁盘结构

    Linux--文件描述符、文件指针、索引节点

    一、Linux —— 文件描述符

    1、文件描述符 Fd

    当进程打开文件或创建新文件时,内核会返回一个文件描述符(非负整数),用来指向被打开的文件,所有执行I/O操作的系统调用(read、write)都会通过文件描述符。

    文件描述符可以理解为进程文件描述表这个表的索引,或者把文件描述表看做一个数组的话,文件描述符可以看做是数组的下标。当需要进行I/O操作的时候,会传入fd作为参数,先从进程文件描述符表查找该fd对应的那个条目,取出对应的那个已经打开的文件的句柄,根据文件句柄指向,去系统fd表中查找到该文件指向的inode,从而定位到该文件的真正位置,从而进行I/O操作。

    Linux的文件描述符、文件指针、索引节点详情

    特点:

    • 每个文件描述符会与一个打开的文件相对应
    • 不同的文件描述符也可能指向同一个文件
    • 相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开

    相关的三张表:

    进程级的文件描述符表

    
    struct task_struct {
      //...
      
        struct files_struct *files // 进程级别的文件描述符表
        
      //...
        
    };

    2、系统级的文件描述符表

    内核对系统所有打开的文件维护了一个打开文件表,表中每一项称为打开文件句柄,一个打开文件句柄描述了一个打开文件的全部信息

    • 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)
    • 打开文件时所使用的状态标识(即,open()的flags参数)
    • 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)
    • 与信号驱动相关的设置
    • 对该文件i-node对象的引用
    • 文件类型(例如:常规文件、套接字或FIFO)和访问权限
    • 一个指针,指向该文件所持有的列表
    • 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

    3、文件系统的inode表

    每个文件系统会为存储于其上的所有文件维护一个inode表

    文件描述符表、打开文件表、inode表之间的关系:

    Linux的文件描述符、文件指针、索引节点详情

    进程A文件描述符1和20指向同一个打开文件句柄,是因为多次调用open()等函数打开同一个文件导致。

    进程A的文件描述符2和进程B的文件描述符2指向同一个打开文件句柄可能是因为调用fork()后出现的,子进程会继承父进程的打开文件描述符表,也就是子进程继承父进程打开文件。;或者某进程通过unix域套接字将一个打开的文件描述符传递给另一个进程;或者不通进程独自调用open函数打开同一个文件是正好分配到与其他进程打开该文件描述符一样。

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

    二、文件指针 *FILE

    C语言中使用的是文件指针而不是文件描述符作为I/O的句柄,“文件指针(file pointer)”指向进程用户区中的一个被称为FILE结构的数据结构。当通过文件指针操作文件时,需要调用C语言stdio.h中提供的文件api(fopen()、fread()等)。

    文件描述符在POSIX系统调用中直接可见,文件指针是C语言在其基础上的包装。

    
    int open(const char *path, int access,int mode)  
    FILE *fopen(char *filename, char *mode)

    文件路径 到 文件指针:filepath --fopen()-->FILE*;
    文件路径 到 文件描述符:filepath--open()--fd;
    文件描述符 到 文件指针:fd--fdopen()-->FILE*;
    文件指针 到 文件描述符:FILE*--fileno()--->fd;

    三、索引节点 Inode

    index node是类unix系统中保存文件系统中对象元数据的数据结构。

    inode主要存储以下数据:

    • inode编号
    • 文件大小
    • 占用的块数目与块大小
    • 文件类型(普通文件、目录、管道,etc.)
    • 存储该文件的设备号
    • 链接数目
    • 读、写、执行权限
    • 拥有者的用户ID和组ID
    • 文件的最近访问、数据最近修改时间
    • inode最近修改时间

    stat命令可以查看元数据,`df -i查看每个硬盘分区的inode总数和已经使用的数量。除了文件名以外的所有信息,都存在inode中。

    inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

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

    每个文件都有一个inode,因此有可能inode已经用完但是硬盘还未存满的情况。linux系统不使用文件名而使用inode来识别文件。

    表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

    目录文件就是由一系列目录项组成的数据结构,每个目录项包含文件名和inode号码两部分。

    1、Inode特殊作用

    • 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
    • 移动文件或重命名文件,只是改变文件名,不影响inode号码。
    • 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

    第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

    四、拓展

    1、磁盘结构

    文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

    操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

    Linux的文件描述符、文件指针、索引节点详情

    Linux的文件描述符、文件指针、索引节点详情

    Linux的文件描述符、文件指针、索引节点详情

    由上,可用(柱面号,盘面号,扇区号)来定位任意一个“磁盘块”,我们经常提到文件数据存放在外存中的几号块(逻辑地址),这个块号就可以转换成(柱面号,盘面号,扇区号)的地址形式。

    可根据该地址读取一个“块”,操作如下:

    ① 根据“柱面号”移动磁臂,让磁头指向指定柱面(也称磁道)

    ② 激活指定盘面对应的磁头;

    ③ 磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写

    到此这篇关于Linux的文件描述符、文件指针、索引节点详情的文章就介绍到这了,更多相关Linux文件描述符、文件指针、索引节点内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    --结束END--

    本文标题: Linux的文件描述符、文件指针、索引节点详情

    本文链接: https://www.lsjlt.com/news/21382.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 详解Android文件描述符
      介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏。 一、什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 ...
      99+
      2024-04-02
    • Linux下文件标述符和文件指针的示例分析
      这篇文章主要介绍了Linux下文件标述符和文件指针的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   Linux下的文件标述符和文件指针文件标识...
      99+
      2023-06-09
    • Linux 文件描述符 fd 是什么
      这篇文章主要讲解了“Linux 文件描述符 fd 是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux 文件描述符 fd 是什么”吧!前情概要我们知道有两种文件读写的方式,一种是系...
      99+
      2023-06-15
    • Linux中如何修改文件描述符的大小
      这篇文章主要介绍Linux中如何修改文件描述符的大小,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Linux下默认的文件描述符大小为1024,可以通过下面的命令查看:[root@localhost ~]# ulim...
      99+
      2023-06-12
    • Linux如何实现文件描述符和重定向
      这篇文章主要介绍Linux如何实现文件描述符和重定向,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、st...
      99+
      2023-06-13
    • 【Linux】基础IO(万字详解) —— 系统文件IO | 文件描述符fd | 重定向原理
      🌈欢迎来到Linux专栏~~基础IO ...
      99+
      2023-09-05
      linux 运维 服务器
    • Linux在Bash脚本中如何关闭文件描述符
      这篇文章主要介绍了Linux在Bash脚本中如何关闭文件描述符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux 在Bash脚本中怎么关闭文件描述符的实例在写一个Bas...
      99+
      2023-06-09
    • Bash中的&符号和文件描述符如何理解
      这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&、|、;...
      99+
      2023-06-16
    • Linux中通过Socket文件描述符寻找连接状态
      本篇内容介绍了“Linux中通过Socket文件描述符寻找连接状态”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Proc虚拟文件系统下面有许...
      99+
      2023-06-13
    • 如何在linux中解决文件描述符限制问题
      如何在linux中解决文件描述符限制问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.问题描述在调试一个问题的时候,socket始终连接不上,返回的句柄大约...
      99+
      2023-06-09
    • Linux中如何增大可打开文件描述符的最大数
      这篇文章主要为大家展示了“Linux中如何增大可打开文件描述符的最大数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何增大可打开文件描述符的最大数”这篇文章吧。在安装Oracle ...
      99+
      2023-06-12
    • 【看表情包学Linux】文件描述符 | 重定向 Redirection | dup2 函数 | 缓冲区的理解 (Cache)
        🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅  🔥 💭 写在前面:在上一章中,我们已经把 fd 的基本原理搞清楚了。本章我们将开始探索 fd 的...
      99+
      2023-09-02
      linux 运维 服务器 原力计划
    • 【看表情包学Linux】初识文件描述符 | 虚拟文件系统 (VFS) 初探 | 系统传递标记位 | O_TRUNC | O_APPEND
      爆笑教程《看表情包学Linux》👈 猛戳订阅!​​​​​ 💭 写在前面:通过上一章节的讲解,想必大家已对文件系统基本的接口有一个简单的了解,本章我们将继续深入讲解,继续学习系统传递标志位,介绍 O_WRONL...
      99+
      2023-08-31
      服务器 linux 运维 文件描述符
    • 浅谈JavaWeb中的web.xml配置部署描述符文件
      1、 定义头和根元素部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2....
      99+
      2023-05-31
      javaweb web.xml 配置部署
    • Linux下如何利用文件描述符恢复的成功失败实验
      这篇文章将为大家详细讲解有关Linux下如何利用文件描述符恢复的成功失败实验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据误删除是作为初级运维人员常常遇到的“低级错误...
      99+
      2024-04-02
    • 如何在Linux服务器上设置ulimit和文件描述符数限制
      这篇文章主要为大家展示了“如何在Linux服务器上设置ulimit和文件描述符数限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何在Linux服务器上设置ulimit和文件描述符数限制”这篇...
      99+
      2023-06-16
    • 怎么在Linux服务器上设置ulimit和文件描述符数限制
      这篇文章主要为大家展示了“怎么在Linux服务器上设置ulimit和文件描述符数限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么在Linux服务器上设置ulimit和文件描述符数限制”这篇...
      99+
      2023-06-16
    • 导致IOError:[Errno 9]错误的文件描述符的原因是什么
      导致 IOError: [Errno 9] 错误的文件描述符的原因可能是以下几种情况:1. 文件描述符已经关闭:在尝试对已经关闭的文...
      99+
      2023-09-26
      IOError
    • PHP的文件索引同步技术详解
      PHP作为一种常用的服务器端编程语言,经常需要对文件进行操作。在文件操作中,文件索引同步技术是非常重要的。本文将详细介绍PHP的文件索引同步技术,同时提供相应的演示代码。 一、什么是文件索引同步技术? 在文件操作中,文件索引是指将文件的关...
      99+
      2023-07-09
      同步 文件 索引
    • 如何描述Python代码加密中源码保护的pyc文件字节码
      如何描述Python代码加密中源码保护的pyc文件字节码,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。pyc文件'字节码'关于Python代码加...
      99+
      2023-06-17
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作