Inotify
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)
取消對某個路徑之監控。 如同之前所描述的,當檔案系統異動時,核心將會依據程式設定的條件,觸發相應的事件。事件的結構如下:
可供應用程式追蹤的事件有:
缺點inotify無法監控软链接型的子目錄。 歷史沿革相關條目參考資料
外部連結
|
Portal di Ensiklopedia Dunia