文件打开的过程——调用fd=open()时操作系统所做的工作

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件打开的过程——调用fd=open()时操作系统所做的工作相关的知识,希望对你有一定的参考价值。

fd=fopen()是一个系统调用。用于依据文件名称打开一个文件。返回该文件的文件描写叙述符,文件打开后进程便能够依据文件描写叙述符fd进行其它操作,比方读,写,关闭等操作。

各个操作系统打开文件的过程是类似的,本文以Unix为例,介绍打开一个文件操作系统所做的工作。正式介绍这个过程之前先简要介绍几个概念。

PCB(process control block)进程控制块。它是一个内核数据结构,相当于一个档案,是操作系统感知进程存在的唯一标识。包含进程状态,进程id,PC,寄存器,内存信息,文件打开信息等,例如以下图所看到的

技术分享

FCB(file control block)文件控制块,是文件系统的一部分。在磁盘上通常会创建一个文件系统,文件系统中包括文件夹信息。以及文件的FCB信息。FCB一半包括文件的读写模式。全部者,时间戳,数据块指针等信息。unix的FCB称为inode。其结构例如以下图所看到的

技术分享本图片来自http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/os-figures.zip


文件打开的步骤例如以下图所看到的(从右往左看)

技术分享


首先,操作系统依据文件名称a,在系统文件打开表中查找

第一种情况:

假设文件a已经打开。则在进程文件打开表中为文件a分配一个表项,然后将该表项的指针指向系统文件打开表中和文件a相应的一项;

然后再PCB中为文件分配一个文件描写叙述符fd,作为进程文件打开表项的指针,文件打开完毕。

另外一种情况:

假设文件a没有打开。查看含有文件a信息的文件夹项是否在内存中。假设不在,将文件夹表装入到内存中,作为cache。

依据文件夹表中文件a相应项找到FCB在磁盘中的位置。

将文件a的FCB装入到内存中的Active inode中。

然后在系统文件打开表中为文件a添加新的一个表项,将表项的指针指向Active Inode中文件a的FCB;

然后在进程的文件打开表中分配新的一项,将该表项的指针指向系统文件打开表中文件a相应的表项。

然后在PCB中,为文件a分配一个文件描写叙述符fd,作为进程文件打开表项的指针,文件打开完毕。





以上是关于文件打开的过程——调用fd=open()时操作系统所做的工作的主要内容,如果未能解决你的问题,请参考以下文章

系统最大fd数和进程中最大fd数

文件IO详解---open函数详解

Linux中文件描述符fd和文件指针flip的理解

[ APUE ] 第三章 文件系统

Linux 文件截断的几种方式

linux打开文件数 too many open files 解决办法