APUE-文件和目錄(四)文件系統

一個命令 mkfs

講文件系統前先介紹一個用於建立文件系統的命令:
mkfs數據庫

mkfs [options] [-t type fs-options] device [size]

描述
mkfs用來在設備上建立一個Linux文件系統,這個設備一般狀況下是一個硬盤分區。上面的device參數要麼是設備名(例如:/dev/hda1,/dev/sdb2),或者爲包含文件系統的一個普通文件。size參數爲此文件系統使用的block的數量。函數

返回值0表明成功,1表明失敗。測試

選項(參數)指針

  • -t --type type
    指定將要建立的文件系統的類型。默認爲ext2。
  • fs-options
    用來傳遞給文件系統生成器的特定選項。下面的選項被大多數文件系統生成器所支持。

-V,--verbosecode

產生詳細輸出,包括被執行的全部的文件系統的特定命令的輸出。屢次(大於一次)指定這個選項會抑制任意文件系統的特定命令的執行。這隻在測試的狀況下才會用到。
-V, --version進程

顯示版本信息後退出。(選項-V只有在它是惟一參數的狀況下才會顯示版本信息,不然按照--verbose來工做。)rem

-h,--help
顯示幫助信息字符串

APUE中的文件系統

APUE中講的是以Berkeley快速文件系統爲基礎的Unix文件系統。io

咱們能夠把一個磁盤分爲一個或多個分區。每一個分區均可以包含一個文件系統,參照圖4.13。test

硬鏈接

問題:爲何刪除一個目錄項的函數被稱之爲unlink而不叫作delete。

i節點是固定長度的記錄項,它包含有關文件的大部分信息。圖4-14中的兩個目錄項指向同一個i節點。每一個i 節點都有一個連接計數,其值是指向該i節點的目錄項數。只有當連接計數減小至0時,纔可刪除該文件(也就是能夠釋放該文件佔用的數據塊)。這就是爲何刪除一個目錄項被稱做unlink的緣由。在stat結構中,連接計數包含在st_nlink成員中,其基本系統數據類型是nlink_t。這種類型稱爲硬鏈接

軟連接(符號連接)

符號連接文件的實際內容包含了該符號連接所指向的文件的名字。看下面的例子:

lrwxrwxrwx 1 root 7 Sep 25 07:14 lib -> usr/lib

目錄項中的文件名是3個字符的字符串lib,而在該文件中包含了7個字節的數據usr/lib。該i節點的文件類型是S_IFLINK,因而系統知道這是一個符號連接。

文件信息

i節點包含了文件有關的全部信息:文件類型、文件訪問權限、文件長度和指向文件數據庫的指針等。stat結構中的大多數信息都取自i節點。只有兩項重要數據存放在目錄項中:文件名和i節點編號。i節點標號的數據類型爲ino_t。

ln命令和mv命令

ln命令用戶建立連接(硬鏈接和軟鏈接),由於目錄項中的i節點編號指向同一文件系統中的相應i節點,一個目錄項不能指向另外一個文件系統的i節點。所以ln命令(構造一個指向一個現有文件的新目錄項)不能跨文件系統。

在不跨文件系統爲一個文件重命名時,該文件的實際內容並未移動,只須要構造一個指向現有i節點的新目錄項,並刪除老的目錄項。連接計數不會變。這是mv(1)命令的一般操做方式。

目錄文件的連接計數

假設咱們建立了一個新目錄

$mkdir testdir

圖4-15顯示結果。該圖顯示的顯示了.和..目錄項。圖中顯示了兩個i節點:

  • 編號爲2549的i節點,其字段類型表示這是一個目錄,連接計數爲2。任何一個頁目錄(不包含任何目錄的目錄)的連接計數老是2,它來自命名該目錄的目錄項以及在該目錄中的.項。
  • 編號爲1267的i節點,其字段類型表示它是一個目錄,連接計數大於等於3。由於至少有三個目錄項指向它,一個是命名它的目錄項(圖中沒有顯示),第二個是在該目錄中的.項,第三個是在子目錄testdir中的..項。
    注意: 在父目錄中的每個子目錄都使該父目錄的連接計數增長1。

函數link、linkat、unlink、unlinkat和remove

建立一個文件連接

任何一個文件能夠有多個目錄項指向其i節點。建立一個指向現有文件的連接的方法是使用link函數或者linkat函數。

#include <unistd.h>
int link(const char*existingpath,const char *newpath);
int linkat(int efd,const char*existingpath,int fd,const char*newpath,int flag);
成功返回0;出錯返回-1

這兩個函數建立一個新目錄項newpath,它引用現有文件existingpath。若是newpath已經存在,則返回出錯。只建立newpath中的最後一個份量,路徑中的其餘部分應該已經存在。

  • 大多數文件系統不支持跨越文件系統的連接。
  • 大多數文件系統不支持建立指向一個目錄的硬連接,由於這樣作可能在文件系統中造成循環。

刪除一個文件連接

爲了刪除一個現有的目錄項,能夠調用unlink函數。

#include <unistd.h>
int unlink(const char*pathname);
int unlinkat(int fd,const char*pathname,int flag);
成功返回0,出錯返回-1

什麼狀況下才會刪除一個文件的內容

  • 使用unlink函數會將pathname所引用文件的連接計數減1。若是對該文件還有其餘連接,則仍可經過其餘文件訪問該文件的數據。若是出錯,則不對該文件作任何更改。
  • 使用unlink函數解除一個文件的連接,必須對包含該目錄項的目錄具備寫和執行權限,此外,若是對該目錄設置了粘着位,還須要具有下面三個條件之一:
    1. 擁有該文件;
    2. 擁有該目錄;
    3. 具備超級用戶權限。
  • 檢查連接計數以前,內核會檢查打開該文件的進程個數,若是進程數爲0纔會去檢查連接計數,若是計數也是0,那麼就會刪除該文件的內容。
相關文章
相關標籤/搜索