學習Unix,我們要從基礎開始。這裡,我們就來學習下Unix文件系統基礎。Unix內核有兩個基本的子系統:Unix文件子系統和進程控制子系統。Unix文件子系統負責文件的相關操作和管理進程控制子系統則負責與進程相關的操作與管理。
內核文件子系統
它主要負責訪問和管理系統及用戶文件。Unix系統只是把文件看作是一組數據字節,對它們的解釋是通過系統提供的某種結構進行的。Unix內核文件子系統使用了三個數據結構來描述每一個文件以及訪問文件的途徑,它們分別是與具體進程相關的文件描述符表項,與內核相關的文件表項,與每個文件相關的索引節點。
文件描述符表:在內核中,對應於每個進程,都有一個文件描述符表,用來標識改進程要打開的所有文件。該表中的每一項對應一個進程打開的文件,每一項中有一個稱為文件描述符(file description)的整型數用來標識文件。
文件表:文件表中的每一項對應於內核中打開的文件,主要描述用戶對文件的訪問權限及讀寫起始地址。索引節點(Index Node,又稱inode)文件的具體信息是通過索引節點來描述的。根據所在位置的不同,inode分為磁盤inode和內存inode。
進程要訪問文件,必須通過上述三種數據結構來進行,過程具體如下:
進程先訪問與它對應的文件描述符表,通過它訪問文件表,進而訪問inode表中與文件相關的inode表項,最後通過inode去訪問文件,如下圖所示。
文件類型
Unix文件類型有許多種,當用戶使用ls –l filename命令時,所列內容的第一項的第一位就標識了文件系統的類型。
正規文件(regular file):又稱為普通文件,在使用ls –l時,所列內容的第一項的第一位為“-”。系統中源碼、文本和shell程序等都是正規文件。
目錄文件:在Unix系統中,目錄是一種特殊的文件,它的內容是所包含的文件的信息:文件的位置、大小、文件的創建時間等。使用ls –l時,第一項第一列的標識為“d”。目錄文件只能由操作系統或專門的程序來讀取和修改,普通用戶無法直接訪問目錄文件,只能讀取目錄文件的內容。
套接字:socket是Unix系統中用於計算機之間相互通信的應用程序的接口它將完成網絡上的I/O操作。在Unix系統中,socket並不是一個真正的文件,但是它被抽象成一個文件,使用ls –l命令時,第一項第一位的標識為“s”。
設備文件(device file):Unix系統為了實現與外設相關的操作,提供設備文件專門負責內存與外設間的I/O操作。Unix系統中有兩種設備文件:字符設備文件(character device file)和塊設備文件(block device file)。
字符設備文件用於與外設進行無緩沖的I/O操作,使用ls –l時,其第一項第一位標識為“e”;塊設備文件用於與外設進行有緩沖的I/O操作,使用ls –l時,其第一項的第一位標識為“b”。一般來說,系統中的磁盤驅動器(包括硬盤和CDROM)為塊設備文件,磁帶驅動器和終端驅動器為字符設備文件。鍵盤和顯示器為系統的兩個標准輸入/輸出的字符設備文件。
有名管道(FIFO文件):Unix系統提供了使用管道實現進程間通信的方法。它是一個臨時文件,嚴格遵守先進先出的原則,因此又稱為FIFO文件。在使用ls –l時,第一項第一位的標識為“p”。
鏈接(link):系統中的鏈接是一個已經存在的文件的另一個名字,它不復制文件的內容。有兩種鏈接方式,一種是硬鏈接(hard link),另一種是符號鏈接(symbolic link),又稱軟鏈接。硬鏈接和原有文件是存儲在同一物理地址的兩個不同的名字,因此硬鏈接是相互的;符號鏈接的內容只是一個所鏈接文件的文件名,在使用ls –l時,符號鏈接的第一項的第一位為“l”。
在這裡,我們關於Unix文件的知識,我們就學習這些簡單的知識。