inotify
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | 此條目翻譯自英語維基百科,需要相關領域的編者協助校對翻譯。 |
![]() | 此條目需要精通或熟悉相關主題的編者參與及協助編輯。 |
inotify是Linux核心子系統之一,做為檔案系統的附加功能,它可監控檔案系統並將異動通知應用程式。本系統的出現取代了舊有Linux核心裏,擁有類似功能之dnotify模組。
inotify的原始開發者為John McCutchan、羅伯特·拉姆與Amy Griffis。於Linux核心2.6.13發行時(2005年六月十八日),被正式納入Linux核心[1]。儘管如此,它仍可透過修補程式的方式與2.6.12甚至更早期的Linux核心整合。
inotify的主要應用於桌面搜尋軟件,像:Beagle,得以針對有變動的檔案重新索引,而不必沒有效率地每隔幾分鐘就要掃描整個檔案系統。相較於主動輪詢檔案系統,透過作業系統主動告知檔案異動的方式,讓Beagle等軟件甚至可以在檔案更動後一秒內更新索引。
此外,諸如:更新目錄檢視、重新載入設定檔、追蹤變更、備份、同步甚至上載等許多自動化作業流程,都可因而受惠。
優點
相較於被inotify取代較舊的 dnotify模組,inotify有諸多益處。[2][3]在舊的模組中,程式必須為每一個被監控的目錄建立file descriptor,這種作法很容易讓行程擁有的file descriptor逼近系統允許的上限,進而形成瓶頸。dnotify產生的file decriptor也會導致系統資源忙碌,使可移除裝置無法被移除,徒增使用上的困擾。
由於dnotify只能讓程式設計師監控目錄層級的變化,「精細度」亦是「dnotify」的劣勢之一。為此,程式設計師必須付出額外的心力,自行撰寫程式碼以期追蹤更細微的檔案系統事件。
inotify相較之下使用較少的file descriptor,亦允許select()與poll()介面,優於dnotify使用的訊號系統。這也使得inotify與既有以select()或poll()為基礎之函式庫(如:Glib)整合更加便利。
運作方式
inotify擁有專為其設計的系統函數。十分容易上手。
#include <sys/inotify.h>
要使用inotify必須先參照上面的標頭檔。
int inotify_init(void)
建立一個inotify的實體並回傳一個file descriptor,此檔案描述子可供讀取檔案事件。隨後,可透過read()接收事件,為了避免不斷輪詢檔案,read()預設將採用同步I/O的模式,直到事件發生後才會返回。
int inotify_add_watch(int fd, const char* pathname, int mask)
透過路徑名稱(pathname)並選定遮罩(mask)以監控inode。inotify_add_watch()會回傳一個監控器(watch descriptor),它代表pathname指向的inode(不同的pathname有可能指向相同的inode)。
int inotify_rm_watch(int fd, int wd)
取消對某個路徑之監控。
如同之前所描述的,當檔案系統異動時,核心將會依據程式設置的條件,觸發相應的事件。事件的結構如下:
欄位名稱 | 內容描述 |
---|---|
wd | 監控子 |
mask | 事件遮罩 |
cookie | 用來辨別IN_MOVED_FROM與IN_MOVED_TO事件 |
len | name欄位長度 |
name | 觸發該事件的檔案名稱(以上層目錄為基準) |
可供應用程式追蹤的事件有:
- IN_ACCESS - 讀取檔案
- IN_MODIFY - 檔案被修改
- IN_ATTRIB - 檔案屬性變更
- IN_OPEN - 檔案被開啟
- IN_CLOSE_WRITE - 被開啟為「可寫入」狀態的檔案遭關閉
- IN_CLOSE_NOWRITE - 被開啟為「非寫入」狀態的檔案遭關閉
- IN_MOVED_FROM and IN_MOVED_TO - 檔案被搬動或更名
- IN_DELETE - 檔案或目錄被刪除
- IN_CREATE - 監控中的目錄下有新檔案產生
- IN_DELETE_SELF - 監控中的檔案遭刪除
缺點
inotify無法監控軟連結型的子目錄。
歷史沿革
相關條目
參考資料
- ^ Linux 2.6.13, kernelnewbies.org. [2012-03-06]. (原始內容存檔於2020-10-19).
- ^ Why inotify?. [2012-03-06]. (原始內容存檔於2010-01-16).
- ^ inotify README file. [2012-03-06]. (原始內容存檔於2016-12-29).
外部連結
- Kernel Korner (頁面存檔備份,存於互聯網檔案館) - Intro to inotify by Robert Love (2005)
- LWN Article on Inotify (頁面存檔備份,存於互聯網檔案館) Watching filesystem events with inotify (partly out of date)
- IBM Article (頁面存檔備份,存於互聯網檔案館) Monitor Linux file system events with inotify.