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,作為進程文件打開表項的指針,文件打開完畢。