文件IO 文件描述符表

1. 文件IO

1. 基本结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2. 文件描述符表、文件表、文件结构体、文件描述符之间的关系

文件描述符(fd):一个整数,用于标识进程打开的文件,由用户空间程序使用。

文件描述符表:每个进程都有自己的表,存储着该进程打开的文件描述符,并指向文件表中的 struct file

文件表:内核的全局表,存储着所有进程打开的文件信息,每个条目是 struct file 结构体。

文件结构体(struct file:内核中每个打开文件的具体表示,包含文件的状态和操作函数。

当一个进程打开一个文件时:

  • 进程调用 open(),内核为文件创建一个 struct file 对象,并将其放入全局文件表中。
  • 内核为进程分配一个文件描述符,并在进程的文件描述符表中为该描述符添加一个条目,该条目指向刚刚创建的 struct file
  • 文件描述符(如 fd=3)用于用户程序与内核交互,它通过文件描述符表找到 struct file,然后操作内核中的文件。

当进程对文件进行 readwrite 等操作时:

  • 内核通过文件描述符查找进程的文件描述符表,找到指向的 struct file 结构体。
  • 通过 struct file 中的操作函数(f_op)执行对应的文件操作。

3. 同一个文件 文件结构体

同一个文件的 struct file 结构体在某些情况下是唯一的,但在其他情况下可能会有多个不同的 struct file 实例,具体取决于文件是如何被打开的和进程如何操作该文件。

在这里插入图片描述

struct file 不一定唯一:同一个文件在以下情况下会有多个 struct file 实例:

  • 当一个进程多次使用 open() 打开文件时,每次 open() 会产生独立的 struct file
  • 不同的进程各自通过 open() 打开同一个文件时,内核为每个进程分配独立的 struct file

struct file 可以共享:在以下情况下,多个文件描述符可以共享同一个 struct file

  • 父子进程通过 fork() 共享相同的文件描述符。
  • 使用 dup()dup2() 复制文件描述符时,新旧文件描述符共享同一个 struct file
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值