使用Inotify 監控Linux 檔案系統事件(轉)

BSDLite發表於2007-08-15
使用Inotify 監控Linux 檔案系統事件(轉)[@more@]  Inotify 是檔案系統事件監控機制,計劃包含在即將釋出的 Linux 核心中作為 dnotify 的有效替代。dnotify 是較早核心支援的檔案監控機制。Inotify 是一種強大的、細粒度的、非同步的機制,它滿足各種各樣的檔案監控需要,不僅限於安全和效能。下面讓我們一起學習如何安裝 inotify 和如何構建一個示例使用者空間應用程式來響應檔案系統事件。

  檔案系統事件監控對於從檔案管理器到安全工具的各種程式都是必要的,但是 dnotify(早期核心中的標準)存在一些侷限性,這使我們期待出現一種更加完善的機制。抱著這種期待,我們發現了 inotify,一種更加現代化的檔案系統事件監控替代品。

  為什麼使用 inotify?

  使用 inotify 取代 dnotify 的原因有很多。第一個原因是,dnotify 需要您為每個打算監控是否發生改變的目錄開啟一個檔案描述符。當同時監控多個目錄時,這會消耗大量的資源,因為有可能達到每個程式的檔案描述符限制。

  除此之外,檔案描述符會鎖定目錄,不允許解除安裝(unmount)支援的裝置,這在存在可移動介質的環境中會引發問題。在使用 inotify 時,如果正在監控被解除安裝的檔案系統上的檔案,那麼監控會被自動移除並且您會接收到一個解除安裝事件。

  dnotify 不如 inotify 的第二個原因是 dnotify 有點複雜。注意,使用 dnotify 基礎設施的簡單檔案系統監控粒度只停留於目錄級別。為了使用 dnotify 進行更細粒度的監控,應用程式程式設計人員必須為每個受監控的目錄保留一個 stat 結構的快取。該使用者空間的 stat 結構快取需要用來明確確定當接收到通知訊號時目錄發生了什麼變化。當獲得通知訊號時,生成 stat 結構列表並與最新的狀態相比較。顯而易見,這種技術是不理想的。

  inotify 的另一個優點是它使用檔案描述符作為基本介面,使應用程式開發者使用 select 和 poll 來監控裝置。這允許有效的多路 I/O 和與 Glib 的 mainloop 的整合。相反,dnotify 所使用的訊號常常使程式設計師頭疼並且感覺不太優雅。

  inotify 透過提供一個更優雅的 API 解決了這些問題,該 API 使用最少的檔案描述符,並確保更細粒度的監控。與 inotify 的通訊是透過裝置節點提供的。基於以上原因,對於監控 Linux 2.6 平臺上的檔案,inotify 是您最明智的選擇。

  安裝 inotify

  安裝 inotify 的第一步是確定您使用的 Linux 核心是否支援它。檢查發行版的最簡單方法是,尋找是否存在 /dev/inotify 裝置。如果存在該裝置,您可以跳到 在簡單應用程式中使用 inotify 一節。

  在撰寫本文時,inotify 包含在 Andrew Morton 的 Linux 2.6-mm 目錄樹中,而且一些 Linux 發行版正在提供支援 inotify 的核心(包括 Gentoo 和 Ubuntu)或者具有提供支援的補充核心包(例如 Fedora 和 SuSE)。因為 Andrew 可能會根據需要從目錄樹刪除對 inotify 的支援,並且 inotify 版本還處於頻繁的開發階段,所以強烈建議您從頭開始打補丁。

  如果缺少該裝置,您可能需要對核心打補丁並建立該裝置。

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

相關文章