正文

回到頂部

一個(gè)命令 mkfs

講文件系統(tǒng)前先介紹一個(gè)用于創(chuàng)建文件系統(tǒng)的命令:
mkfs

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

描述
mkfs用來在設(shè)備上創(chuàng)建一個(gè)Linux文件系統(tǒng),這個(gè)設(shè)備通常情況下是一個(gè)硬盤分區(qū)。上面的device參數(shù)要么是設(shè)備名(例如:/dev/hda1,/dev/sdb2),或者為包含文件系統(tǒng)的一個(gè)普通文件。size參數(shù)為此文件系統(tǒng)使用的block的數(shù)量。

返回值0代表成功,1代表失敗。

選項(xiàng)(參數(shù))

  • -t --type type
    指定將要?jiǎng)?chuàng)建的文件系統(tǒng)的類型。默認(rèn)為ext2。

  • fs-options
    用來傳遞給文件系統(tǒng)生成器的特定選項(xiàng)。下面的選項(xiàng)被大多數(shù)文件系統(tǒng)生成器所支持。

-V,--verbose

產(chǎn)生詳細(xì)輸出,包括被執(zhí)行的所有的文件系統(tǒng)的特定命令的輸出。多次(大于一次)指定這個(gè)選項(xiàng)會(huì)抑制任意文件系統(tǒng)的特定命令的執(zhí)行。這只在測(cè)試的情況下才會(huì)用到。
-V, --version

顯示版本信息后退出。(選項(xiàng)-V只有在它是唯一參數(shù)的情況下才會(huì)顯示版本信息,否則按照--verbose來工作。)

-h,--help
顯示幫助信息

回到頂部

APUE中的文件系統(tǒng)

APUE中講的是以Berkeley快速文件系統(tǒng)為基礎(chǔ)的Unix文件系統(tǒng)。

我們可以把一個(gè)磁盤分為一個(gè)或多個(gè)分區(qū)。每個(gè)分區(qū)都可以包含一個(gè)文件系統(tǒng),參照?qǐng)D4.13。

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

硬連接

問題:為什么刪除一個(gè)目錄項(xiàng)的函數(shù)被稱之為unlink而不叫做delete。

i節(jié)點(diǎn)是固定長(zhǎng)度的記錄項(xiàng),它包含有關(guān)文件的大部分信息。圖4-14中的兩個(gè)目錄項(xiàng)指向同一個(gè)i節(jié)點(diǎn)。每個(gè)i 節(jié)點(diǎn)都有一個(gè)鏈接計(jì)數(shù),其值是指向該i節(jié)點(diǎn)的目錄項(xiàng)數(shù)。只有當(dāng)鏈接計(jì)數(shù)減少至0時(shí),才可刪除該文件(也就是可以釋放該文件占用的數(shù)據(jù)塊)。這就是為什么刪除一個(gè)目錄項(xiàng)被稱作unlink的原因。在stat結(jié)構(gòu)中,鏈接計(jì)數(shù)包含在st_nlink成員中,其基本系統(tǒng)數(shù)據(jù)類型是nlink_t。這種類型稱為硬連接。

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

軟鏈接(符號(hào)鏈接)

符號(hào)鏈接文件的實(shí)際內(nèi)容包含了該符號(hào)鏈接所指向的文件的名字??聪旅娴睦樱?/p>

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

目錄項(xiàng)中的文件名是3個(gè)字符的字符串lib,而在該文件中包含了7個(gè)字節(jié)的數(shù)據(jù)usr/lib。該i節(jié)點(diǎn)的文件類型是S_IFLINK,于是系統(tǒng)知道這是一個(gè)符號(hào)鏈接。

文件信息

i節(jié)點(diǎn)包含了文件有關(guān)的所有信息:文件類型、文件訪問權(quán)限、文件長(zhǎng)度和指向文件數(shù)據(jù)庫(kù)的指針等。stat結(jié)構(gòu)中的大多數(shù)信息都取自i節(jié)點(diǎn)。只有兩項(xiàng)重要數(shù)據(jù)存放在目錄項(xiàng)中:文件名和i節(jié)點(diǎn)編號(hào)。i節(jié)點(diǎn)標(biāo)號(hào)的數(shù)據(jù)類型為ino_t。

ln命令和mv命令

ln命令用戶創(chuàng)建鏈接(硬連接和軟連接),因?yàn)槟夸涰?xiàng)中的i節(jié)點(diǎn)編號(hào)指向同一文件系統(tǒng)中的相應(yīng)i節(jié)點(diǎn),一個(gè)目錄項(xiàng)不能指向另一個(gè)文件系統(tǒng)的i節(jié)點(diǎn)。因此ln命令(構(gòu)造一個(gè)指向一個(gè)現(xiàn)有文件的新目錄項(xiàng))不能跨文件系統(tǒng)。

在不跨文件系統(tǒng)為一個(gè)文件重命名時(shí),該文件的實(shí)際內(nèi)容并未移動(dòng),只需要構(gòu)造一個(gè)指向現(xiàn)有i節(jié)點(diǎn)的新目錄項(xiàng),并刪除老的目錄項(xiàng)。鏈接計(jì)數(shù)不會(huì)變。這是mv(1)命令的通常操作方式。

目錄文件的鏈接計(jì)數(shù)

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

假設(shè)我們創(chuàng)建了一個(gè)新目錄

$mkdir testdir

圖4-15顯示結(jié)果。該圖顯示的顯示了.和..目錄項(xiàng)。圖中顯示了兩個(gè)i節(jié)點(diǎn):

  • 編號(hào)為2549的i節(jié)點(diǎn),其字段類型表示這是一個(gè)目錄,鏈接計(jì)數(shù)為2。任何一個(gè)頁(yè)目錄(不包含任何目錄的目錄)的鏈接計(jì)數(shù)總是2,它來自命名該目錄的目錄項(xiàng)以及在該目錄中的.項(xiàng)。

  • 編號(hào)為1267的i節(jié)點(diǎn),其字段類型表示它是一個(gè)目錄,鏈接計(jì)數(shù)大于等于3。因?yàn)橹辽儆腥齻€(gè)目錄項(xiàng)指向它,一個(gè)是命名它的目錄項(xiàng)(圖中沒有顯示),第二個(gè)是在該目錄中的.項(xiàng),第三個(gè)是在子目錄testdir中的..項(xiàng)。
    注意: 在父目錄中的每一個(gè)子目錄都使該父目錄的鏈接計(jì)數(shù)增加1。

回到頂部

函數(shù)link、linkat、unlink、unlinkat和remove

創(chuàng)建一個(gè)文件鏈接

任何一個(gè)文件可以有多個(gè)目錄項(xiàng)指向其i節(jié)點(diǎn)。創(chuàng)建一個(gè)指向現(xiàn)有文件的鏈接的方法是使用link函數(shù)或者linkat函數(shù)。

#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;出錯(cuò)返回-1

這兩個(gè)函數(shù)創(chuàng)建一個(gè)新目錄項(xiàng)newpath,它引用現(xiàn)有文件existingpath。如果newpath已經(jīng)存在,則返回出錯(cuò)。只創(chuàng)建newpath中的最后一個(gè)分量,路徑中的其他部分應(yīng)該已經(jīng)存在。

  • 大多數(shù)文件系統(tǒng)不支持跨越文件系統(tǒng)的鏈接。

  • 大多數(shù)文件系統(tǒng)不支持創(chuàng)建指向一個(gè)目錄的硬鏈接,因?yàn)檫@樣做可能在文件系統(tǒng)中形成循環(huán)。

刪除一個(gè)文件鏈接

為了刪除一個(gè)現(xiàn)有的目錄項(xiàng),可以調(diào)用unlink函數(shù)。

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

什么情況下才會(huì)刪除一個(gè)文件的內(nèi)容

  • 使用unlink函數(shù)會(huì)將pathname所引用文件的鏈接計(jì)數(shù)減1。如果對(duì)該文件還有其他鏈接,則仍可通過其他文件訪問該文件的數(shù)據(jù)。如果出錯(cuò),則不對(duì)該文件做任何更改。

  • 使用unlink函數(shù)解除一個(gè)文件的鏈接,必須對(duì)包含該目錄項(xiàng)的目錄具有寫和執(zhí)行權(quán)限,此外,如果對(duì)該目錄設(shè)置了粘著位,還需要具備下面三個(gè)條件之一:

  1. 擁有該文件;

  2. 擁有該目錄;

  3. 具有超級(jí)用戶權(quán)限。

  • 檢查鏈接計(jì)數(shù)之前,內(nèi)核會(huì)檢查打開該文件的進(jìn)程個(gè)數(shù),如果進(jìn)程數(shù)為0才會(huì)去檢查鏈接計(jì)數(shù),如果計(jì)數(shù)也是0,那么就會(huì)刪除該文件的內(nèi)容。


作者: HarlanC 

博客地址: http://www.cnblogs.com/harlanc/ 
個(gè)人博客: http://www.harlancn.me/ 
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出, 原文鏈接 

如果覺的博主寫的可以,收到您的贊會(huì)是很大的動(dòng)力,如果您覺的不好,您可以投反對(duì)票,但麻煩您留言寫下問題在哪里,這樣才能共同進(jìn)步。謝謝! 

http://www.cnblogs.com/harlanc/p/6985063.html