本文中要介紹一個所謂的"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 平台上,當我們試圖在文件夾窗口中用鼠標點擊右鍵菜單刪除 http://dl.itbulo.com/Search.asp?keyword=Winamp'>Winamp 正在播放的一首 MP3 音樂的時候,