Linux文件IO
8-1C标准库IO函数的工作流程
使用fopen函数打开一个文件,之后会返回一个FILE* fp指针,fp指针指向一个结构体,这个结构体是c 标准io库中的一个结构体,这个结构体有三个重要的成员:
文件描述符:描述符指向一个打开文件表,通过此表可以找到文件的inode表,通过对应的inode可以找到 对应的文件数据块。
文件指针:读和写共享一个文件指针,并且读写过程中可以引起文件指针的变化。
文件缓冲区:在进行读写操作时,会先通过文件缓冲区,因为这样可以减少对磁盘的读写次数,等输入完再 真正地写入文件,提高读写磁盘的效率。
8-2标准库函数与系统函数之间的关系
系统中内置了读写函数,并且提供了相应的api,我们只需调用标准库函数,标准库函数会帮我们调用系 统自带的api。
8-3虚拟地址空间
Linux会为每一个进程分配0到4g的独立内存,这个内存与其他的内存相隔开,相互之间不干扰。这块内 存上有着各种内存区域。
进程的虚拟空间分为内核区(系统维护,用户没有权限对其操作) 和 用户区(这个可以进行操作)。
内核区有着进程管理,内存管理等待其中进程管理中有PCB这么一个区域,以后再介绍他。
用户区的内容:
环境变量:不多说
命令行参数: 不多说
栈空间: 不多说,像局部变量或者递归会用到
共享库:c标准库,系统的库在这里存放着
堆空间:不多说
.bss未初始化全局变量 只读区域
.data已初始化全局变量 只读区域
.text代码段,二进制指令 只读区域
(0到4k)受保护的地址 只读区域
8-4pcb,文件描述符,文件描述符表,打开文件表与inode
pcb,文件描述符和文件描述表
在虚拟地址空间的3-4G的这段空间中,有一个进程控制块,叫做PCB。它维护着一张文件描述符表。(一 个0~1023的数组)
在linux中,所有打开的文件都有一个文件描述符,我们可以通过文件描述符对文件进行读写和访问。文 件描述符表中可以存储1021个文件描述符,其实可以存1024个,只不过前三个元素是固定的。
STDIN_FILENO 标准输入,在下标为0的文件描述符表中
STDOUT_FILENO 标准输出,在下标为1的文件描述符表中
STDERR_FILENO 标准错误,在下标为2的文件描述符表中
每当打开一个文件时,系统就会自动分配最小未使用的文件描述符给打开的文件。我们可以调用系统的 open函数来得到一个文件描述符。
打开文件表:
计算机中所有的进程都共享着一个打开文件表,打开文件表可能是数组,链表,哈希表等数据结构。每个 进程可以通过各自的文件描述符来访问打开文件表。打开文件表中有以下主要内容:
当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)
打开文件时所使用的状态标识(即,open()的flags参数)
文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)
与信号驱动相关的设置
对该文件i-node对象的引用
文件类型(例如:常规文件、套接字或FIFO)和访问权限
一个指针,指向该文件所持有的锁列表
文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳
indoe:
inode是文件系统中的数据结构,用于存储文件的元数据,如文件大小、权限、所有者等。每个文件都有 一个唯一的inode。打开文件表项中的指针指向对应文件的inode。
linux访问一个文件的具体步骤:
当一个进程需要访问一个文件时,它会首先从自己的PCB中获取文件描述符表的指针。然后,通过文件描 述符表找到对应的文件描述符,该文件描述符指向进程的打开文件表中的一个项。该项中又包含了指向对应文 件的inode的指针。
标签:文件,07,表中,描述符,IO,Linux,打开,inode,指针 From: https://www.cnblogs.com/xiaobai1523/p/17962554