一、文件類型
UNXI系統的大多數文件是普通文件或目錄,但是也有另外一些文件類型:
- 普通文件(regular file)。這是最常見的文件類型,這種文件包含了某種形式的數據。至於這種數據是文本還是二進制數據對於內核而言並無區別。對普通文件內容的解釋由處理該文件的應用程序進行。
- 目錄文件(directory file)。這種文件包含了其他文件的名字以及指向與這些文件有關信息的指針。對一個目錄文件具有讀許可權的任一進程都可以讀該目錄的內容,但只有內核可以寫目錄文件。
- 字符特殊文件(character special file)。這種文件用於系統中某些類型的設備。
- 塊特殊文件(block special file)。這種文件典型地用於磁盤設備。系統中的所有設備或者是字符特殊文件,或者是塊特殊文件。
- FIFO。這種文件用於進程間的通信,有時也將其稱爲命名管道。
- 套接口( socket )。這種文件用於進程間的網絡通信。套接口也可用於在一臺宿主機上的進程之間的非網絡通信。
- 符號連接(symbolic link)。這種文件指向另一個文件。文件類型信息包含在stat結構的st_mode成員中。這些宏的參數都是stat結構中的st_mode成員。
二、設置用戶ID和組ID
與一個進程相關的ID有六個~
- 實際用戶ID和實際組ID標識我們究竟是誰。這兩個字段在登錄時取自口令文件中的登錄項。通常,在一個登錄會話期間這些值並不改變,但是超級用戶進程有方法改變它們。
- 有效用戶ID,有效組I D以及添加組ID決定了我們的文件訪問權。
- 保存的設置用戶ID和設置-組ID在執行一個程序時包含了有效用戶 ID和有效組ID的副本。
- 通常,有效用戶ID等於實際用戶ID,有效組ID等於實際組ID。
三、文件存取許可權
每個文件有9個存取許可權位,可將它們分成三類。
- 在用chmod更改文件權限的時候,參數-u表示用戶,-g表示組,-o表示其它。
文件權限的定義
- 若進程的有效用戶ID是0 (超級用戶),則允許存取。這給予了超級用戶對文件系統進行處理的最充分的自由。
- 若進程的有效用戶ID等於文件的所有者ID (也就是該進程擁有此文件):
- 若適當的所有者存取許可權位被設置,則允許存取。適當的存取許可權位指的是,若進程爲讀而打開該文件,則用戶 -讀位應爲1;若進程爲寫而打開該文件,則用戶-寫位應爲1;若進程將執行該文件,則用戶-執行位應爲1
- 否則拒絕存取。
- 若進程的有效組ID或進程的添加組ID之一等於文件的組ID:
- 若適當的組存取許可權位被設置,則允許存取。
- 否則拒絕存取。
- 若適當的其他用戶存取許可權位被設置,則允許存取,否則拒絕存取。
新文件和目錄的所有權
新文件的用戶ID設置爲進程的有效用戶ID。
- 新文件的組ID可以是進程的有效組ID。
- 新文件的組ID可以是它所在目錄的組ID。
四、文件長度
文件長度包含普通文件的長度、目錄文件的長度和符號鏈接的長度。
- 對於普通文件,其文件長度可以是0,在讀這種文件時,將得到文件結束指示。
- 對於目錄,文件長度通常是一個數,例如16或512的整倍數。
- 對於符號連接,文件長度是在文件名中的實際字節數。
五、文件系統
我們可以把一個磁盤分成一個或多個分區,每個分區可以包含一個文件系統。
i節點是固定長度的記錄項,它包含有關文件的信息。
較爲詳細的文件系統。
- 在圖中有兩個目錄項指向同一i節點。每個i節點中都有一個連接計數,其值是指向該i節點的目錄項數。只有當連接計數減少爲0時,纔可刪除該文件(也就是可以釋放該文件佔用的數據塊)。這就是爲什麼“解除對一個文件的連接”操作並不總是意味着“釋放該文件佔用的磁盤塊”的原因。這也就是爲什麼刪除一個目錄項的函數被稱之爲unlink而不是delete的原因。在stat結構中,連接計數包含在st_nlink成員中,其基本系統數據類型是nlink_t。
- 另外一種連接類型稱之爲符號連接(symbolic link)。對於這種連接,該文件的實際內容(在數據塊中)包含了該符號連接所指向的文件的名字。
- i節點包含了所有與文件有關的信息:文件類型、文件存取許可權位、文件長度和指向該文件所佔用的數據塊的指針等等。stat結構中的大多數信息都取自i節點。只有兩項數據存放在目錄項中:文件名和i節點編號數。i節點編號數的數據類型是ino_t。
- 因爲目錄項中的i節點編號數指向同一文件系統中的i節點,所以不能使一個目錄項指向另一個文件系統的i節點。
- 當在不更改文件系統的情況下爲一個文件更名時,該文件的實際內容並未移動,只需構造一個指向現存i節點的新目錄項,並刪除老的目錄項。