inotify

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

inotifyLinux核心子系統之一,做為檔案系統的附加功能,它可監控檔案系統並將異動通知應用程式。本系統的出現取代了舊有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_FROMIN_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無法監控軟連結型的子目錄。

歷史沿革[編輯]

相關條目[編輯]

參考資料[編輯]

  1. ^ Linux 2.6.13, kernelnewbies.org. [2012-03-06]. (原始內容存檔於2020-10-19). 
  2. ^ Why inotify?. [2012-03-06]. (原始內容存檔於2010-01-16). 
  3. ^ inotify README file. [2012-03-06]. (原始內容存檔於2016-12-29). 

外部連結[編輯]