2014-08-27 68 views
1

我想製作一個C++應用程序來監視其目錄或其子目錄中的文件更改。我知道inotify可以監視單層目錄的變化,我需要爲每個子目錄手動添加一個監視來檢測子目錄中的變化。 我需要知道是否有任何其他方式遞歸監視Linux中除inotify以外的目錄中的更改。如何遞歸監視除了使用inotify以外的目錄

+1

爲什麼你雖然想避免使用inotify的遞歸解決方案?事實上,實施它對你來說不會那麼麻煩。 – 2014-08-27 10:45:46

+0

一件容易忘記的事情是,隨着子目錄的添加和刪除,您必須不斷添加和刪除它們的inotify。 – MSalters 2014-08-27 11:06:03

+0

要在內核中實現這個東西,當修改dir/file時,要在層次結構中查找是否有要通知的遞歸觀察點可能找不到任何。這是對內核時間和資源的浪費,這就是它沒有在內核代碼中實現的原因....但是,您只需註冊一次大量的目錄,並且只需遞歸一次即可註冊。否則,你可以修改你的內核來這樣做。你必須考慮哪些資源被浪費了。內核還計算時間資源。 – 2014-08-29 05:49:47

回答

1

是的,有古老的傳統方式:只需間隔檢查目錄(遞歸)。存儲所有文件和目錄及其修改日期的列表。然後,很容易看到您是否有新的文件/目錄,是否已刪除或修改過。

時間,雖然耗時,你需要存儲關於每個文件和目錄的數據,因此,如果您嘗試這樣做的根目錄下,你會使用大量的內存或存儲。

+0

感謝您的回覆。有沒有其他方法可以降低內存或像inotify這樣的其他子系統的成本,我可以用它來遞歸地監控目錄變化。 – rex 2014-08-27 11:31:44

0

也許你想混合inotify和dnotify來實現這一點。

+0

感謝您的回覆 – rex 2014-08-30 12:20:44

+0

dnotify是一個較老的界面,不再推薦。你可以使用它,但你不會比inotify更進一步。 – 2014-09-03 08:07:55

0

要監視遞歸必須將一個目錄:

  1. inotify_init(2)inotify_init2(2)創建inotify的(7)對象。
  2. 遞歸下降您的目錄,使用inotify_add_watch(2)您想要通知的所有節點(在掃描之前添加目錄本身的手錶,否則您將失去事件---如下)。
  3. 等待事件發生在您收到的inotify描述符上。

考慮到目錄的創建會迫使您重新掃描目錄內容,因爲您可以在監視的目錄上獲取新子目錄的事件,但可以在您有機會添加文件之前創建文件監視最近創建的目錄,因此您不會被通知創建該文件。

出於最後這個原因,您需要考慮將所有東西放在子程序中,並在每次創建新目錄時調用它。通過這種方式,您可能會掃描您將收到創建事件的文件,但另一方面您可能會丟失事件。

此外,您必須準備您的貨架才能完成樹重新掃描以防萬一您丟失了一些事件(在完全隊列溢出中)。

相信我,這比以經典的方式做到這一點要有效得多。你可以在rescans之間繞過短暫的文件。

的原因有沒有一個遞歸解決這個問題已經在上面一個評論已經指出的(你需要的內核爲你做搜索,即使你不感興趣就可以了)

+0

感謝您的回覆 – rex 2014-08-30 12:21:24

+0

是否有任何其他成本更低的方法來在Linux中遞歸監控目錄。 – rex 2014-09-01 06:37:49

+0

我認爲在** inotify(7)**接口中描述的那個接口是您所獲得的遠低於成本的方法。只需重新考慮是否需要監視該層次結構中的所有文件和目錄。模仿圖形文​​件管理器的行爲,因爲它們只檢查帶有用戶界面的開放視口,並在用戶每次更改視圖時進行切換。 – 2014-09-03 08:04:49