请选择 进入手机版 | 继续访问电脑版

Linux的文件形貌 符、文件指针、索引节点详情

[复制链接]
查看99 | 回复15 | 2021-9-13 08:24:23 | 显示全部楼层 |阅读模式
目次

Linux--文件形貌 符、文件指针、索引节点

一、Linux —— 文件形貌 符

1、文件形貌 符 Fd

当进程 打开文件或创建新文件时,内核会返回一个文件形貌 符(非负整数),用来指向被打开的文件,全部 实验 I/O操作的体系 调用(read、write)都会通过文件形貌 符。

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

Linux的文件形貌
符、文件指针、索引节点详情

特点:

  • 每个文件形貌 符会与一个打开的文件相对应
  • 不同的文件形貌 符也大概 指向同一个文件
  • 雷同 的文件可以被不同的进程 打开,也可以在同一个进程 被多次打开

相干 的三张表:

进程 级的文件形貌 符表

  1. struct task_struct {
  2. //...
  3. struct files_struct *files // 进程级别的文件描述符表
  4. //...
  5. };
复制代码

2、体系 级的文件形貌 符表

内核对体系 全部 打开的文件维护了一个

  1. 打开文件表
复制代码
,表中每一项称为
  1. 打开文件句柄
复制代码
,一个打开文件句柄形貌 了一个打开文件的全部信息

  • 当前文件偏移量(调用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()调用。同一个进程 两次打开同一个文件,也会发生雷同 环境 。

二、文件指针 *FILE

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

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

  1. int open(const char *path, int access,int mode)
  2. 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近来 修改时间

  1. stat
复制代码
下令 可以查看元数据,`df -i查看每个硬盘分区的inode总数和已经使用 的数目 。除了文件名以外的全部 信息,都存在inode中。

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

每个inode节点的大小,一样平常 是

  1. 128字节
复制代码
  1. 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的文件形貌
符、文件指针、索引节点详情

由上,可用(

  1. 柱面号,盘面号,扇区号
复制代码
)来定位恣意 一个“磁盘块”,我们常常 提到文件数据存放在外存中的几号块(逻辑地址),这个块号就可以转换成(柱面号,盘面号,扇区号)的地址情势 。

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

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

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

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

到此这篇关于Linux的文件形貌 符、文件指针、索引节点详情的文章就先容 到这了,更多相干 Linux文件形貌 符、文件指针、索引节点内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 芊芊551 | 2021-9-13 10:03:37 | 显示全部楼层
一口气看完了,我要下去回味回味了!
回复

使用道具 举报

avatar 123457732 | 2021-9-19 23:37:28 | 显示全部楼层
小弟默默的路过贵宝地~~~
回复

使用道具 举报

avatar 海田1 | 2021-9-20 16:14:03 | 显示全部楼层
精华帖的节奏啊!
回复

使用道具 举报

avatar 强绝商爸摇 | 2021-9-21 06:44:15 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 阿甘cx1982 | 2021-9-29 17:33:37 | 显示全部楼层
最近压力山大啊!
回复

使用道具 举报

avatar 人生如梦总人q | 2021-10-6 19:26:54 | 显示全部楼层
每次看到admin楼主的帖子都有惊吓!
回复

使用道具 举报

avatar 我爱霍启刚掖 | 2021-10-7 09:43:59 | 显示全部楼层
无图无真相!
回复

使用道具 举报

avatar 123457166 | 2021-10-8 13:58:01 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 随缘6872 | 2021-10-9 15:03:11 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则