Linux 文件打開的過程

fd=fopen()是一個系統調用,用於根據文件名打開一個文件,返回該文件的文件描述符,文件打開後進程即可以根據文件描述符fd進行其餘操做,好比讀,寫,關閉等操做。node

各個操做系統打開文件的過程是相似的,本文以Unix爲例,介紹打開一個文件操做系統所作的工做,正式介紹這個過程以前先簡要介紹幾個概念。數據結構

PCB

PCB(process control block)進程控制塊,它是一個內核數據結構,至關於一個檔案,是操做系統感知進程存在的惟一標識。包括進程狀態,進程id,PC,寄存器,內存信息,文件打開信息等,以下圖所示spa

    

FCB

FCB(file control block)文件控制塊,是文件系統的一部分,在磁盤上通常會建立一個文件系統,文件系統中包含目錄信息,以及文件的FCB信息。FCB一半包含文件的讀寫模式,全部者,時間戳,數據塊指針等信息,unix的FCB稱爲inode,其結構以下圖所示操作系統

 

 

文件打開的過程:

首先,操做系統根據文件名a,在系統文件打開表中查找unix

第一種狀況:指針

若是文件a已經打開,則在進程文件打開表中爲文件a分配一個表項,而後將該表項的指針指向系統文件打開表中和文件a對應的一項;進程

而後再PCB中爲文件分配一個文件描述符fd,做爲進程文件打開表項的指針,文件打開完成。內存

第二種狀況:get

若是文件a沒有打開,查看含有文件a信息的目錄項是否在內存中,若是不在,將目錄表裝入到內存中,做爲cache;file

根據目錄表中文件a對應項找到FCB在磁盤中的位置;

將文件a的FCB裝入到內存中的Active inode中;

而後在系統文件打開表中爲文件a增長新的一個表項,將表項的指針指向Active Inode中文件a的FCB;

而後在進程的文件打開表中分配新的一項,將該表項的指針指向系統文件打開表中文件a對應的表項;

而後在PCB中,爲文件a分配一個文件描述符fd,做爲進程文件打開表項的指針,文件打開完成。

相關文章
相關標籤/搜索