首頁 > 服務(wù)器 > Linux服務(wù)器 > 正文

Linux文件基本知識

2019-10-13 18:41:33
字體:
供稿:網(wǎng)友
Linux
文件基本知識
磁針石
聯(lián)系方式: gmail
and gtalk: xurongzhong#gmail.com
文件路徑:D:/blog/@Linux/linux
基礎(chǔ)/文件系統(tǒng)

參考資料
*      《深入理解Linux內(nèi)核(第三版)》之1.5. An Overview of the Unix
Filesystem
*      《LINUX與UNIX
SHELL編程指南》第一章

2008-10-10  根據(jù)參考資料1,2創(chuàng)建初稿。
文件類型
Unix 文件可以是下列類型之一 :
• 普通文件(regular file)
• 目錄
• 符號鏈接
• 面向塊的設(shè)備文件(block-oriented device file)
• 面向字符的設(shè)備文件(character-oriented device file)
• 管道(pipe)和命名管道(named pipe)(也叫FIFO)
• 套接字(socket)
前三種文件類型是所有Unix 文件系統(tǒng)的基本類型。設(shè)備文件與I/O
設(shè)備以及集成到內(nèi)核中的設(shè)備驅(qū)動程序相關(guān)。例如,當(dāng)程序訪問設(shè)備文件時,它直接訪問與那個文件相關(guān)的I/O 設(shè)備。管道和套接字是用于進(jìn)程間通信的特殊文件。
文件描述符與索引節(jié)點
Unix對文件的內(nèi)容和描述文件的信息給出了清楚的區(qū)分。除了設(shè)備文件和特殊文件系統(tǒng)文件外,每個文件都由字符序列組成。文件內(nèi)容不包含任何控制信息,如文件長度或文件結(jié)束(end-of-file,EOF)符。
文件系統(tǒng)處理文件需要的所有信息包含在一個名為索引節(jié)點(inode)的數(shù)據(jù)結(jié)構(gòu)中。每個文件都有自己的索引節(jié)點,文件系統(tǒng)用索引節(jié)點來標(biāo)識文件。
雖然文件系統(tǒng)及內(nèi)核函數(shù)對索引節(jié)點的處理可能隨Unix系統(tǒng)的不同有很大的差異,但它們必須至少提供在POSIX 標(biāo)準(zhǔn)中指定的如下屬性:


• 文件類型
• 與文件相關(guān)的硬鏈接個數(shù)
• 以字節(jié)為單位的文件長度
• 設(shè)備標(biāo)識符(即包含文件的設(shè)備的標(biāo)識符)
• 在文件系統(tǒng)中標(biāo)識文件的索引節(jié)點號
• 文件擁有者的UID
• 文件的用戶組ID
• 幾個時間戳,表示索引節(jié)點狀態(tài)改變的時間、最后訪問時間及最后修改時間
• 訪問權(quán)限和文件模式

       另有文件的位置。

訪問權(quán)限和文件模式

文件的潛在用戶分為三種類型:
• 作為文件所有者的用戶
• 同組用戶,不包括所有者
• 所有剩下的用戶(其他)
有三種類型的訪問權(quán)限——讀、寫及執(zhí)行每組用戶都有這三種權(quán)限。因此,文件訪問權(quán)限的組合就用九種不同的二進(jìn)制來標(biāo)記。還有三種附加的標(biāo)記,即suid (Set User ID), sgid (Set Group ID),及sticky 用來定義文件的模式。當(dāng)這些標(biāo)記應(yīng)用到可執(zhí)行文件時有如下含義:
suid
進(jìn)程執(zhí)行一個文件時通常保持進(jìn)程擁有者的UID。然而,如果設(shè)置了可執(zhí)行文件
suid 的標(biāo)志位,進(jìn)程就獲得了該文件擁有者的UID。
sgid
進(jìn)程執(zhí)行一個文件時保持進(jìn)程組的用戶組ID。然而,如果設(shè)置了可執(zhí)行文件sgid
的標(biāo)志位,進(jìn)程就獲得了該文件用戶組的ID。
sticky
設(shè)置了sticky 標(biāo)志位的可執(zhí)行文件相當(dāng)于向內(nèi)核發(fā)出一個請求,當(dāng)程序執(zhí)行結(jié)
束以后,依然將它保留在內(nèi)存(這個標(biāo)志已經(jīng)過時,現(xiàn)在使用基于代碼頁共享的其他方法)。

當(dāng)文件由一個進(jìn)程創(chuàng)建時,文件擁有者的ID 就是該進(jìn)程的UID。而其用戶組ID 可以是進(jìn)程創(chuàng)建者的ID,也可以是父目錄的ID,這取決于父目錄sgid 標(biāo)志位的值。
對于文件屬主來說,在只有讀權(quán)限位被置位的情況下,仍然可以通過文件重定向的方法向該文件寫入。能否刪除一個文件還依賴于該文件所在目錄權(quán)限位的設(shè)置。

hmod [who]
operator [permission] filename
who的含義是:
u 文件屬主權(quán)限。
g 同組用戶權(quán)限。
o 其他用戶權(quán)限。
operator的含義:
+ 增加權(quán)限。
- 取消權(quán)限。
= 設(shè)定權(quán)限。
permission的含義:
r 讀權(quán)限。
w 寫權(quán)限。
x 執(zhí)行權(quán)限。
s 文件屬主和組set-ID。
t 粘性位*。
l 給文件加鎖,使其他用戶無法訪問。
u,g,o 針對文件屬主、同組用戶及其他用戶的操作。
*在列文件或目錄時,有時會遇到“
t”位。“t”代表了粘性位。如果在一個目錄上出現(xiàn)
“t”位,這就意味著該目錄中的文件只有其屬主才可以刪除,即使某個同組用戶具有和屬主
同等的權(quán)限。不過有的系統(tǒng)在這一規(guī)則上并不十分嚴(yán)格。
如果在文件列表時看到“ t”,那么這就意味著該腳本或程序在執(zhí)行時會被放在交換區(qū)(虛
存)。不過s于當(dāng)今的內(nèi)存價格如此之低,大可不必理會文件的“ t”的使用。

還可以通過使用- R選項連同子目錄下的文件一起設(shè)置:
chmod -R 664 /usr/local/home/dave/*
這樣就可以一次將/usr/local/home/dave目錄下的所有文件連同各個子目錄下的文件的權(quán)限全部設(shè)置為文件屬主和同組用戶可讀和寫,其他用戶只讀。使用- R選項一定要謹(jǐn)慎,只有在需要改變目錄樹下全部文件權(quán)限時才可以使用。
目錄的讀權(quán)限位意味著可以列出其中的內(nèi)容。寫權(quán)限位意味著可以在該目錄中創(chuàng)建文件,如果不希望其他用戶在你的目錄中創(chuàng)建文件,可以取消相應(yīng)的寫權(quán)限位.
    如果把同組用戶或其他用戶針對某一目錄的權(quán)限設(shè)置為--x,那么他們將無法列出該目錄中的文件。如果該目錄中有一個執(zhí)行位置位的腳本或程序,只要用戶知道它的路徑和文件名,仍然可以執(zhí)行它。用戶不能夠進(jìn)入該目錄并不妨礙他的執(zhí)行。
文件操作的系統(tǒng)調(diào)用
當(dāng)用戶訪問一個普通文件或目錄文件的內(nèi)容時,他實際上是訪問存儲在硬件塊設(shè)備上的一些數(shù)據(jù)。從這個意義上說,文件系統(tǒng)是硬盤分區(qū)物理組織的用戶級視圖。因為處于用戶態(tài)的進(jìn)程不能直接與低層硬件交互,所以每個實際的文件操作必須在內(nèi)核態(tài)下進(jìn)行。因此,Unix 操作系統(tǒng)定義了幾個與文件操作有關(guān)的系統(tǒng)調(diào)用。
所有Unix內(nèi)核都對硬件塊設(shè)備的處理效率給予極大關(guān)注,其目的是為了獲得非常好的系統(tǒng)整體性能。在后面的章節(jié)中,我們將描述Linux 與文件操作相關(guān)的主題,尤其是討論內(nèi)核如何對文件相關(guān)的系統(tǒng)調(diào)用作出反應(yīng)。為了理解這些內(nèi)容,你需要知道如何使用文件操作的主要系統(tǒng)調(diào)用。下面對此給予描述。
*訪問打開的文件
對普通Unix 文件,可以順序地訪問,也可以隨機地訪問,而對設(shè)備文件和命名管道文件,通常只能順序地訪問。在這兩種訪問方式中,內(nèi)核把文件指針存放在打開文件對象中,也就是說,當(dāng)前位置就是下一次進(jìn)行讀或?qū)懖僮鞯奈恢谩?br />順序訪問是文件的默認(rèn)訪問方式,即read()和 write()系統(tǒng)調(diào)用總是從文件指針的當(dāng)前位置開始讀或?qū)?。為了修改文件指針的值,必須在程序中顯式地調(diào)用lseek()系統(tǒng)調(diào)用。當(dāng)打開文件時,內(nèi)核讓文件指針指向文件的第一個字節(jié)(偏移量為0)。
lseek()系統(tǒng)調(diào)用需要下列參數(shù):
newoffset=lseek(fd,
offset, whence);
其參數(shù)含義如下:
fd
表示打開文件的文件描述符。
offset
指定一個有符號整數(shù)值,用來計算文件指針的新位置。
whence
指定文件指針新位置的計算方式:可以是offset 加0,表示文件指針從文件頭移動;
也可以是offset 加文件指針的當(dāng)前位置,表示文件指針從當(dāng)前位置移動;還可以是
offset 加文件最后一個字節(jié)的位置,表示文件指針從文件末尾開始移動。

read()系統(tǒng)調(diào)用需要以下參數(shù):
nread= read(fd,
buf, count);
其參數(shù)含義如下:
fd
表示打開文件的文件描述符。
buf
指定在進(jìn)程地址空間中緩沖區(qū)的地址,所讀的數(shù)據(jù)就放在這個緩沖區(qū)。
count
表示所讀的字節(jié)數(shù)。
當(dāng)處理這樣的系統(tǒng)調(diào)用時,內(nèi)核會嘗試從擁有文件描述符fd的文件中讀count個字節(jié),其起始位置為打開文件的offset 字段的當(dāng)前值。在某些情況下可能遇到文件結(jié)束、空管道等等,因此內(nèi)核無法成功地讀出全部count 個字節(jié)。返回的nread 值就是實際所讀的字節(jié)數(shù)。給原來的值加上nread 就會更新文件指針。write()的參數(shù)與read()相似。

*關(guān)閉文件
當(dāng)進(jìn)程無需再訪問文件的內(nèi)容時,就調(diào)用系統(tǒng)調(diào)用:
res=close(fd);
釋放與文件描述符fd 相對應(yīng)的打開文件對象。當(dāng)一個進(jìn)程終止時,內(nèi)核會關(guān)閉其所有仍然打開著的文件。*更名及刪除文件
要重新命名或刪除一個文件時,進(jìn)程不需要打開它。實際上,這樣的操作并沒有對這個文件的內(nèi)容起作用,而是對一個或多個目錄的內(nèi)容起作用。例如,系統(tǒng)調(diào)用:
res= rename(oldpath, newpath);
改變了文件鏈接的名字,而系統(tǒng)調(diào)用:
res= unlink(pathname);
減少了文件鏈接數(shù),刪除了相應(yīng)的目錄項。只有當(dāng)鏈接數(shù)為0 時,文件才被真正刪除。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表