講文件系統前先介紹一個用於建立文件系統的命令:
mkfs數據庫
mkfs [options] [-t type fs-options] device [size]
描述
mkfs用來在設備上建立一個Linux文件系統,這個設備一般狀況下是一個硬盤分區。上面的device參數要麼是設備名(例如:/dev/hda1,/dev/sdb2),或者爲包含文件系統的一個普通文件。size參數爲此文件系統使用的block的數量。函數
返回值0表明成功,1表明失敗。測試
選項(參數)指針
-V,--verbosecode
產生詳細輸出,包括被執行的全部的文件系統的特定命令的輸出。屢次(大於一次)指定這個選項會抑制任意文件系統的特定命令的執行。這隻在測試的狀況下才會用到。
-V, --version進程
顯示版本信息後退出。(選項-V只有在它是惟一參數的狀況下才會顯示版本信息,不然按照--verbose來工做。)rem
-h,--help
顯示幫助信息字符串
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命令用戶建立連接(硬鏈接和軟鏈接),由於目錄項中的i節點編號指向同一文件系統中的相應i節點,一個目錄項不能指向另外一個文件系統的i節點。所以ln命令(構造一個指向一個現有文件的新目錄項)不能跨文件系統。
在不跨文件系統爲一個文件重命名時,該文件的實際內容並未移動,只須要構造一個指向現有i節點的新目錄項,並刪除老的目錄項。連接計數不會變。這是mv(1)命令的一般操做方式。
假設咱們建立了一個新目錄
$mkdir testdir
圖4-15顯示結果。該圖顯示的顯示了.和..目錄項。圖中顯示了兩個i節點:
任何一個文件能夠有多個目錄項指向其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
什麼狀況下才會刪除一個文件的內容