Inotify

inotify是Linux核心子系統之一，做為檔案系統的附加功能，它可監控檔案系統並將異動通知應用程式。本系統的出現取代了舊有Linux核心裡，擁有類似功能之dnotify模組。

inotify的原始開發者為John McCutchan、羅伯特·拉姆與Amy Griffis。於Linux核心2.6.13發行時(2005年六月十八日)，被正式納入Linux核心。儘管如此，它仍可透過修補程式的方式與2.6.12甚至更早期的Linux核心整合。

inotify的主要應用於桌面搜索軟體，像：Beagle，得以針對有變動的檔案重新索引，而不必沒有效率地每隔幾分鐘就要掃描整個檔案系統。相較於主動輪詢檔案系統，透過作業系統主動告知檔案異動的方式，讓Beagle等軟體甚至可以在檔案更動後一秒內更新索引。

此外，諸如：更新目錄檢視、重新載入設定檔、追蹤變更、備份、同步甚至上傳等許多自動化作業流程，都可因而受惠。

 優點 
相較於被inotify取代較舊的 dnotify模組，inotify有諸多益處。在舊的模組中，程式必須為每一個被監控的目錄建立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無法監控软链接型的子目錄。

 歷史沿革 
 August 2005 - 整合至Linux 2.6.13
 July 2004 - 首次發表 

 相關條目 
 File alteration monitor
 Gamin
 DMAPI
 kqueue
 FSEvents

參考資料

 外部連結 
 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.

Category:Linux内核功能
Category:操作系统技术