码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-19 18:08:19      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:操作系统   文件系统   

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()时操作系统所做的工作

标签:操作系统   文件系统   

原文地址:http://blog.csdn.net/giantpoplar/article/details/46955853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!