本文中要介紹乙個所謂的"linux 檔案系統的守護神",這是指乙個能實時地觀察 linux 檔案系統的變化情況的程式模組。能夠實時的觀察檔案系統的變化情況,並做出及時的適當的反應,這對於應用 linux 做桌面計算機系統來說,是十分的有趣,也是十分的重要的。本文還要介紹 linux 檔案系統的非同步 i/o 的擴充套件。同樣,這對於 linux 系統的桌面應用也是關鍵的。
1、linux 檔案系統的守護神
傳統的 linux 檔案系統呈現給使用者程式的介面,確實是十分的乾淨利落。使用者程式可以開啟乙個檔案,向檔案中inmgluiddt線性的寫入資料,從檔案的某一位置開始,線性的讀出資料,關閉乙個檔案,刪除乙個檔案,建立乙個檔案,等等。請看,只有這麼若干個簡潔的操作原語,可是卻能提供這麼多豐富的應用。但是,我們注意到,用於訪問 linux 的檔案系統的這些操作原語,並沒有提供非常複雜的加鎖解鎖的功能。這是一件很奇妙的事情,如果來自不同的使用者程式的請求發生了衝突怎麼辦呢?
我們不妨走的再靠近一點,仔細的看看刪除乙個檔案是怎樣進行的。如果已經有乙個使用者程式在訪問乙個檔案,而另外乙個使用者程式正好要刪除這乙個檔案,這時會發生些什麼呢?我們知道,linux 的檔案系統是基於所謂的 inode 的,每個檔案都相伴有乙個 inode。在 inode 中記錄了關於這個檔案的一些系統資訊,比如檔案的所有者,檔案相關的一些許可權記錄,關於檔案的若干個時間戳,等等。在記憶體中的 inode 還維持著乙個關於自己的使用計數。每當乙個 inode 所代表的檔案被開啟一次,這個 inode 就把關於自己的使用計數加一。每當這個 inode 所代表的檔案一被關閉,這個 inode 就把關於自己的使用計數減一。當使用者程式刪除乙個檔案的時候,相關的系統呼叫很快就返回到這個使用者程式,告訴它,相應的檔案已經被刪除了。但是相應的 inode 還是保留在系統中,inode 首先要檢查自己的使用計數,如果使用計數為零,那麼 linux kernel 才可以真正的去刪除這個檔案。如果使用計數大於零,也就是說,還有其它的使用者程式在訪問這乙個檔案,那麼 linux kernel 需要等待這些其他的使用者程式乙個個都完成對這乙個檔案的訪問才行。也就是說,要等到這個 inode 的使用計數掉到零,才能真正的去刪除這乙個檔案。
我們可以設想一下,如果有乙個 *** **程式在**一首 *** **,我們覺得它不好聽,就到硬碟上找到這個檔案,把它 rm 掉了。這時候,*** **程式並不受到影響,還是可以繼續**這首 *** **,雖然這時候在檔案系統上用 ls 已經找不到這個 *** **檔案了。實際上,一直要到 *** **程式停止**這首 *** **,然後 linux 檔案系統才真正的從硬碟上刪除這個 *** 檔案。這個經驗和我們在 windows 平台上遇到的截然不同。
在 windows 平台上,當我們試圖在資料夾視窗中用滑鼠點選右鍵選單刪除 winamp 正在**的一首 *** **的時候,windows 系統會用乙個彈出對話方塊告訴我們,這個檔案正在被使用,沒辦法刪除。windows 系統的關於刪除檔案的這樣乙個解釋,如果使用不當的話,會帶來乙個滑稽可笑的問題。我們可以設想一下,使用者的乙個 p2p 的檔案共享程式提供了乙個 *** 檔案以供別人**,恰巧這個 *** **檔案十分的熱門,不斷的有人來**,這個使用者最終決定要節省一下頻寬,想要把這個 *** **檔案刪除掉,但是 windows 系統卻不允許使用者這樣做,因為這個 p2p 的檔案共享程式總是在使用這個 *** 檔案。使用者要想刪除這個檔案,不得不先把 p2p 的檔案共享程式給停下來!呵呵。
但是 linux 的檔案系統的操作原語也有它自己的問題。我們知道,在乙個 linux shell 的命令列上,先 rm,然後再 ls,非常的乾淨,被 rm 的檔案沒有了,被刪除了。但是我們可www.cppcns.com以設想有乙個圖形介面的檔案管理程式,當使用者從 shell 的命令列上 rm 掉乙個檔案的時候,這個圖形介面的檔案管理程式並沒有收到任何人發給它的任何訊息,它還以為什麼都沒有發生,被刪除掉的檔案還在那兒。這實在是很 u.g.l.y. 啊。
那麼要想解決這個問題,乙個明顯的但是非常不好的辦法,就是讓乙個後台程序 daemon 每隔乙個很短的時間間隔,就檢查一下檔案系統上這個目錄的情況,看看有沒有發生什麼變化。這個辦法的缺點真的是顯而易見的,不但系統的效能受到影響,而且它的反應也還不是實時的。
如果我們需要使用者程式能夠實時地了解檔案系統上某乙個目錄的變化情況,從實時這個角度出發,顯然,我們需要有乙個中斷機制。我們都知道,硬體中斷能夠實時程式設計客棧地把系統某乙個部件的情況反映給**處理器,同樣的,要想把位於系統核心中的檔案系統的情況實時地反映給使用者程式,我們也需要乙個由作業系統核心到達使用者程序的軟體中斷機制。熟悉 linux 系統程式設計的讀者朋友們立即就會想到,這個中斷機制在 linux 系統中早已就有了,這就是訊號傳遞 signal。
找到了訊號傳遞這樣乙個中斷使用者程序的機制,一切似乎都已齊備,看來可以動手實現這樣乙個 linux 檔案系統的守護神,來實時地監視檔案系統的變化情況,並且及時地把訊息通知給使用者程式了。不過且慢,讓我們搜尋一下 linux kernel,看看是否有別人也在做同樣的工作。哈哈,果不其然,原來這樣乙個實時地監視檔案系統情況的機制早已在 linux 核心中實現了。下面一段就是取自 linux kernel 文件的一段小小例程,說明了 linux kernel 中的 dnotify 功能的用法。dnotify 就是指 directory notification,監視檔案系統上乙個目錄中的情況。
#define _gnu_source /* needed to get the defines */
#include /* in glibc 2.2 this has the needed
values defined */
#include
#include
#include
static volatile int event_fd;
// 訊號處理例程
static void handler(int sig, siginfo_t *si, void *data)
int main(void)
}上面這一小段例程,對於熟悉 linux 系統程式設計的讀者朋友們來說,是很容易理解的。程式首先註冊乙個訊號處理例程,然後通知 kernel,我要觀察 fd 上的 dn_modify 和 dn_create 和 dn_multishot 事件。(關於這些事件的詳細定義,請讀者朋友們參閱文後所列的參考資料。) linux kernel 收到這個請求後,把相應的 fd 的 inode 給做上記號,然後 linux kernel 和使用者應用程式就自顧自去處理各自的別的事情去了。等到 inode 上發生了相應的事件,linux kernel 就把訊號發給使用者程序,於是開始執行訊號處理例程,使用者程式對檔案系統上的變化也就可以及時的做出反應了。而在這整個過程中,系統以及使用者程式的正常執行基本上未受到效能上的影響。這裡還需要說明的是,dnotify 並沒有通過增加新的系統呼叫來完成它的功能,而是通過 fcntl 來完成任務的。增加乙個系統呼叫,相對來說是乙個很大的手術,而且如果設計不當,處理得不好的話,傷疤會一直留在那裡,這是 linux kernel 的開發者們所非常不願意見到的事情。
2、linux 檔案系統的非同步 i/o 擴充套件
對於桌面計算機系統來說,能夠快速的響應使用者的請求,這也是十分關鍵的。換句話說,當使用者移動滑鼠的時候,不管系統正在進行什麼天大的、重要的、神聖的、不可打斷的工作,它都得立即停下,並且要讓滑鼠立即流暢的在計算機螢幕上完美地運動起來。對於習慣在傳統的 linux 命令列上工作的讀者朋友們來說,讓滑鼠能夠在任何時間都可以在計算機螢幕上向無頭蒼蠅一樣地亂竄,竟然被當成是最重要的系統任務,這實在有一點讓人難以接受。不過,當你從 linux 命令列上轉移到 gnome 或者 kde 這樣的圖形介面的使用者環境的時候,滑鼠被鎖死,百分之百的也是會讓你失去理智的。所以,還是讓我們接受這乙個現實,看一看如何才能增加系統的響應速度吧。
從檔案系統的角度講,特別是考慮到網路檔案系統,它的響應速度有可能會相當的慢。當使用者在檔案管理程式中,選擇了對檔案進行某乙個操作以後,檔案系統可能會需要相當長的時間,才能完成這一操作。如果檔案管理程式必須要等待檔案系統完成這一操作,然後才能繼續的話,這顯然會給檔案管理程式的使用者帶來非常不愉快的經歷。解決這乙個問題的辦法,就是要實現非同步的檔案系統 i/o。
在 linux 的 gnome 桌面環境中,由 gnomevfs 包裹了真正的 linux 檔案系統 i/o,實現了乙個非同步的檔案系統 i/o 介面 api。我們可以看到下面這個用 gnomevfs 開啟檔案的例子。
enum _gnomevfsopenmode ;
typedef enum _gnomevfsopenmode gnomevfsopenmode;
typedef void (* gnomevfsasyncopencallback)
(gnomevfsasynchandle *handle,
gnomevfsresult result,
gpointer callback_data);
gnomevfsresult gnome_vfs_async_open
(gnomevfsasynchandle **handle_return,
const gchar *text_uri,
gnomevfsopenmode open_mode,
gnomevfsasyncopencallback callback,
gpointer callback_data);
我們注意到,上面的**段中,使用者程式為了開啟乙個檔案,向 gnomevfs 註冊了乙個 call back 例程。在註冊了這乙個 call back 例程之後,函式呼叫就立即返回給使用者程式,使用者程式就可以處理自己的別的事情去了,比如進一步響應來自使用者的其??肭螅?鵲取6?蔽募?低懲瓿啥暈募?拇蚩?僮饕院螅珿nomevfs 就會呼叫剛剛註冊的 call back 例程,通知使用者程式,檔案已經開啟。
3、小結
我們在本文中了解了 linux kernel 中的 dnotifywww.cppcns.com,可以幫助我們實時地監視檔案系統目錄樹中的變化情況;也了解了 gnome 桌面環境的 gnomevfs 非同步檔案系統 i/o 擴充套件;可以幫助使用者程式不至於被檔案系統的請求所 block。這兩個功能對於 linux 系統在桌面上的應用都是很重要的。
本文標題: linux檔案系統的桌面應用
本文位址:
linux 檔案系統 Linux 檔案系統結構介紹
ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...
nfs檔案系統的應用
一 ubuntu系統安裝nfs kernel server sudo apt get install portmap nfs kernel server sudo apt get install portmap nfs common 二 ubuntu系統建立共享資料夾 三 配置伺服器nfs kern...
Linux的檔案系統
如果您是一位新手,也許 您還不知道如何把檔案從windows拷貝到linux上吧?下面,我們將說明unix檔案系統以及mount的工作過程,然後再比較詳細地討論 mount的使用和有關選項。如果您已經了解unix檔案系統是如何工作的,那麼可以跳過下面一節。否則,您最好繼續接著學習 mount 的含義...