Linux作業系統檔案系統的桌面應用(轉)

ba發表於2007-08-17
Linux作業系統檔案系統的桌面應用(轉)[@more@]  本文中要介紹一個所謂的"Linux 檔案系統的守護神",這是指一個能實時地觀察 Linux 檔案系統的變化情況的程式模組。能夠實時的觀察檔案系統的變化情況,並做出及時的適當的反應,這對於應用 Linux 做桌面計算機系統來說,是十分的有趣,也是十分的重要的。本文還要介紹 Linux 檔案系統的非同步 I/O 的擴充套件。同樣,這對於 Linux 系統的桌面應用也是關鍵的。

  1、Linux 檔案系統的守護神

  傳統的 Linux 檔案系統呈現給使用者程式的介面,確實是十分的乾淨利落。使用者程式可以開啟一個檔案,向檔案中線性的寫入資料,從檔案的某一位置開始,線性的讀出資料,關閉一個檔案,刪除一個檔案,建立一個檔案,等等。請看,只有這麼若干個簡潔的操作原語,可是卻能提供這麼多豐富的應用。但是,我們注意到,用於訪問 Linux 的檔案系統的這些操作原語,並沒有提供非常複雜的加鎖解鎖的功能。這是一件很奇妙的事情,如果來自不同的使用者程式的請求發生了衝突怎麼辦呢?

  我們不妨走的再靠近一點,仔細的看看刪除一個檔案是怎樣進行的。如果已經有一個使用者程式在訪問一個檔案,而另外一個使用者程式正好要刪除這一個檔案,這時會發生些什麼呢?我們知道,Linux 的檔案系統是基於所謂的 inode 的,每個檔案都相伴有一個 inode。在 inode 中記錄了關於這個檔案的一些系統資訊,比如檔案的所有者,檔案相關的一些許可權記錄,關於檔案的若干個時間戳,等等。在記憶體中的 inode 還維持著一個關於自己的使用計數。每當一個 inode 所代表的檔案被開啟一次,這個 inode 就把關於自己的使用計數加一。每當這個 inode 所代表的檔案一被關閉,這個 inode 就把關於自己的使用計數減一。當使用者程式刪除一個檔案的時候,相關的系統呼叫很快就返回到這個使用者程式,告訴它,相應的檔案已經被刪除了。但是相應的 inode 還是保留在系統中,inode 首先要檢查自己的使用計數,如果使用計數為零,那麼 Linux Kernel 才可以真正的去刪除這個檔案。如果使用計數大於零,也就是說,還有其它的使用者程式在訪問這一個檔案,那麼 Linux Kernel 需要等待這些其他的使用者程式一個個都完成對這一個檔案的訪問才行。也就是說,要等到這個 inode 的使用計數掉到零,才能真正的去刪除這一個檔案。

  我們可以設想一下,如果有一個 MP3 播放程式在播放一首 MP3 音樂,我們覺得它不好聽,就到硬碟上找到這個檔案,把它 rm 掉了。這時候,MP3 播放程式並不受到影響,還是可以繼續播放這首 MP3 音樂,雖然這時候在檔案系統上用 ls 已經找不到這個 MP3 音樂檔案了。實際上,一直要到 MP3 播放程式停止播放這首 MP3 音樂,然後 Linux 檔案系統才真正的從硬碟上刪除這個 MP3 檔案。這個經驗和我們在 Windows 平臺上遇到的截然不同。

  在 Windows 平臺上,當我們試圖在資料夾視窗中用滑鼠點選右鍵選單刪除 Winamp 正在播放的一首 MP3 音樂的時候,Windows 系統會用一個彈出對話方塊告訴我們,這個檔案正在被使用,沒辦法刪除。Windows 系統的關於刪除檔案的這樣一個解釋,如果使用不當的話,會帶來一個滑稽可笑的問題。我們可以設想一下,使用者的一個 P2P 的檔案共享程式提供了一個 MP3 檔案以供別人下載,恰巧這個 MP3 音樂檔案十分的熱門,不斷的有人來下載,這個使用者最終決定要節省一下頻寬,想要把這個 MP3 音樂檔案刪除掉,但是 Windows 系統卻不允許使用者這樣做,因為這個 P2P 的檔案共享程式總是在使用這個 MP3 檔案。使用者要想刪除這個檔案,不得不先把 P2P 的檔案共享程式給停下來!呵呵。

  但是 Linux 的檔案系統的操作原語也有它自己的問題。我們知道,在一個 Linux Shell 的命令列上,先 rm,然後再 ls,非常的乾淨,被 rm 的檔案沒有了,被刪除了。但是我們可以設想有一個圖形介面的檔案管理程式,當使用者從 Shell 的命令列上 rm 掉一個檔案的時候,這個圖形介面的檔案管理程式並沒有收到任何人發給它的任何訊息,它還以為什麼都沒有發生,被刪除掉的檔案還在那兒。這實在是很 U.G.L.Y. 啊。

  那麼要想解決這個問題,一個明顯的但是非常不好的辦法,就是讓一個後臺程式 Daemon 每隔一個很短的時間間隔,就檢查一下檔案系統上這個目錄的情況,看看有沒有發生什麼變化。這個辦法的缺點真的是顯而易見的,不但系統的效能受到影響,而且它的反應也還不是實時的。

  如果我們需要使用者程式能夠實時地瞭解檔案系統上某一個目錄的變化情況,從實時這個角度出發,顯然,我們需要有一箇中斷機制。我們都知道,硬體中斷能夠實時地把系統某一個部件的情況反映給中央處理器,同樣的,要想把位於系統核心中的檔案系統的情況實時地反映給使用者程式,我們也需要一個由作業系統核心到達使用者程式的軟體中斷機制。熟悉 Linux 系統程式設計的讀者朋友們立即就會想到,這個中斷機制在 Linux 系統中早已就有了,這就是訊號傳遞 signal。

  找到了訊號傳遞這樣一箇中斷使用者程式的機制,一切似乎都已齊備,看來可以動手實現這樣一個 Linux 檔案系統的守護神,來實時地監視檔案系統的變化情況,並且及時地把訊息通知給使用者程式了。不過且慢,讓我們搜尋一下 Linux Kernel,看看是否有別人也在做同樣的工作。哈哈,果不其然,原來這樣一個實時地監視檔案系統情況的機制早已在 Linux 核心中實現了。下面一段就是取自 Linux Kernel 文件的一段小小例程,說明了 Linux Kernel 中的 dnotify 功能的用法。dnotify 就是指 directory notification,監視檔案系統上一個目錄中的情況。
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-963595/,如需轉載,請註明出處,否則將追究法律責任。

Linux作業系統檔案系統的桌面應用(轉)
請登入後發表評論 登入
全部評論

相關文章