我想製作一個C++應用程序來監視其目錄或其子目錄中的文件更改。我知道inotify可以監視單層目錄的變化,我需要爲每個子目錄手動添加一個監視來檢測子目錄中的變化。 我需要知道是否有任何其他方式遞歸監視Linux中除inotify以外的目錄中的更改。如何遞歸監視除了使用inotify以外的目錄
1
A
回答
1
是的,有古老的傳統方式:只需間隔檢查目錄(遞歸)。存儲所有文件和目錄及其修改日期的列表。然後,很容易看到您是否有新的文件/目錄,是否已刪除或修改過。
這是時間,雖然耗時,你需要存儲關於每個文件和目錄的數據,因此,如果您嘗試這樣做的根目錄下,你會使用大量的內存或存儲。
+0
感謝您的回覆。有沒有其他方法可以降低內存或像inotify這樣的其他子系統的成本,我可以用它來遞歸地監控目錄變化。 – rex 2014-08-27 11:31:44
0
0
要監視遞歸必須將一個目錄:
- 與inotify_init(2)或inotify_init2(2)創建inotify的(7)對象。
- 遞歸下降您的目錄,使用inotify_add_watch(2)您想要通知的所有節點(在掃描之前添加目錄本身的手錶,否則您將失去事件---如下)。
- 等待事件發生在您收到的inotify描述符上。
考慮到目錄的創建會迫使您重新掃描目錄內容,因爲您可以在監視的目錄上獲取新子目錄的事件,但可以在您有機會添加文件之前創建文件監視最近創建的目錄,因此您不會被通知創建該文件。
出於最後這個原因,您需要考慮將所有東西放在子程序中,並在每次創建新目錄時調用它。通過這種方式,您可能會掃描您將收到創建事件的文件,但另一方面您可能會丟失事件。
此外,您必須準備您的貨架才能完成樹重新掃描以防萬一您丟失了一些事件(在完全隊列溢出中)。
相信我,這比以經典的方式做到這一點要有效得多。你可以在rescans之間繞過短暫的文件。
的原因有沒有一個遞歸解決這個問題已經在上面一個評論已經指出的(你需要的內核爲你做搜索,即使你不感興趣就可以了)
相關問題
- 1. 如何使用dnotify/inotify命令連續監視目錄
- 2. 遞歸地監視目錄以添加/修改/刪除文件
- 3. inotify,inotify_add_watch()監視多個目錄,C++
- 4. C程序使用inotify監視多個目錄以及子目錄?
- 5. 遞歸地scp除當前目錄外
- 6. 如何遞歸移除目錄?
- 7. 如何刪除一個目錄遞歸
- 8. Inotify兼容Shell腳本來監視某個目錄的shell
- 9. 保持目錄和所有子目錄遞歸除了文件
- 10. emacs遞歸刪除目錄?
- 11. 遞歸刪除目錄
- 12. 遞歸地刪除目錄
- 13. 遞歸刪除目錄
- 14. 如何遞歸刪除以「xxxxx」開頭的目錄?
- 15. 使用FileSystemWatcher監視目錄
- 16. 使用FileSystemWatcher監視目錄
- 17. 如何使用Perl遞歸刪除所有.svn目錄?
- 18. 如何使用grep在遞歸搜索中排除目錄?
- 19. 遞歸監視一個HDFS目錄spark streaming
- 20. 遞歸刪除目錄用C
- 21. 遞歸刪除除了每個目錄中的某個數字以外的所有文件
- 22. 在繁忙的目錄中使用inotify
- 23. 目錄遞歸
- 24. 遞歸目錄只進了檔深
- 25. inotify獲取目錄
- 26. Python IOError:[遞歸目錄2]來自遞歸目錄調用
- 27. 如何使用SELECT INTO OUTFILE寫入除/ tmp以外的目錄?
- 28. 使用PowerShell的遞歸目錄列表
- 29. 如何監視Windows目錄的更改?
- 30. 如何使用fgrep |遞歸地刪除目錄中的字符串sed的
爲什麼你雖然想避免使用inotify的遞歸解決方案?事實上,實施它對你來說不會那麼麻煩。 – 2014-08-27 10:45:46
一件容易忘記的事情是,隨着子目錄的添加和刪除,您必須不斷添加和刪除它們的inotify。 – MSalters 2014-08-27 11:06:03
要在內核中實現這個東西,當修改dir/file時,要在層次結構中查找是否有要通知的遞歸觀察點可能找不到任何。這是對內核時間和資源的浪費,這就是它沒有在內核代碼中實現的原因....但是,您只需註冊一次大量的目錄,並且只需遞歸一次即可註冊。否則,你可以修改你的內核來這樣做。你必須考慮哪些資源被浪費了。內核還計算時間資源。 – 2014-08-29 05:49:47