Linux 的世界,一切皆文件

Linux 的世界,一切皆文件

在linux的世界中,它会把一切都看作是文件,包括普通文件、目录文件、字符设备(键盘、鼠标等)、块设备(硬盘、光驱等)、socket、epoll、socket、管道、终端等等,所有一切都抽象成了文件,提供了统一的接口,用于程序调用。

文件描述符


linux 把一切视为文件,那我们写的程序是怎么找到具体的某个文件呢?

文件描述符(file description FD)即为文件的一个标识,程序通过操作fd来操作文件。

当应用程序请求内核打开、新建一个文件时,内核就会返回一个fd,用户对应这个打开、新建的文件,其就是一个非负整数。实际上,它是一个表的索引值,指向内核为每个进程所维护的该进程打开文件的记录表。

fd从0开始,但是0、1、2已经被固定使用了,再增加就是从3开始

  • 0:标准输入(system.in())
  • 1:标准输出(system.out(),输出到屏幕)
  • 2:标准错误输出(system.error())

简单示意图:
在这里插入图片描述


实际上关于文件描述符,Linux内核维护了3个数据结构:

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

文件描述符表、打开文件表、inode表关系图:
在这里插入图片描述

通过fd 找到打开的文件指针,再找到文件偏移量+inode 指针,就可以找到i-node对应的真实文件内容。

文件描述符表

系统为每个进程维护一份文件描述符表,每一个条目都记录了单个文件描述符的相关信息,包括:

  • 文件描述符标识
  • 打开文件的指针

打开文件列表


内核对所有打开的文件维护一个系统级别的打开文件描述表(open file description table)。表中的条目称为打开文件描述体(open file description),一个打开的文件相关信息,包括:

  • 文件偏移量(file offset),调用read()和write()更新,调用seek()直接修改
  • 访问模式(status flags),由open()调用设置,例如:只读、只写或读写等
  • i-node对象指针(v-node ptr),指向一个inode元素,从而关联物理文件

文件描述符是一个重要的系统资源,理论上系统内存多大就应该可以打开多少个文件描述符,但是实际情况是,内核会有系统级限制,以及用户级限制(不让某一个应用程序进程消耗掉所有的文件资源,可以使用ulimit -n 查看)

文件描述符唯一:进程id + 文件描述符ID确认唯一

i-node表


inode 是什么?

理解inode,要从文件储存说起。

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

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

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

inode的内容

在linux系统中,文件使用inode号来描述,inode存储了文件的很多元信息。每个文件系统会为存储于其上的所有文件(包括目录)维护一个i-node表

单个i-node包含以下信息:

  • 文件类型(file type),可以是常规文件、目录、套接字或FIFO
  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
    链接数,即有多少文件名指向这个inode
  • 文件数据block的位置

i-node存储在磁盘设备上,内核在内存中维护了一个副本,这里的i-node表为后者。副本除了原有信息,还包括:引用计数、所在设备号以及一些临时属性,

可以用stat命令,查看某个文件的inode信息:stat test.txt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值