(轉)使用inotify、inotify_add_watch、inotify_rm_watch、read編寫監控程序


轉自:http://blog.csdn.net/myarrow/article/details/7096460

inotify是什么

inotify是文件系統變化通知機制,在監聽到文件系統變化后,會向相應的應用程序發送事件

典型的應用場景是文件管理器,理想情況下是用戶修改了文件內容后立刻顯示出文件最新的內容,而刷新后才顯示,如果沒有inotify機制,一般會采用輪詢的方式實現這種功能,這不能再第一時間反應文件系統的變化,而且浪費CPU時間

inotify用戶接口

inotify通過三個系統調用和在返回的文件描述符上的文件I/O操作來使用

#include <sys/inotify.h>

int inotify_init()//初始化inotify,每個inotify實例對應一個排隊的序列

int inotify_add_watch(int fd,const char *path,uint32_t mask)//通過文件名和事件掩碼添加一個watch對象,返回值是watch對象的描述符
//fd:inotify_init的返回值
//path:要監控的文件路徑
//mask:監聽文件的哪些事件
/*
    IN_ATTRIB,文件屬性被修改
    IN_CLOSE_WRITE,可寫文件被關閉
    IN_CLOSE_NOWRITE,不可寫文件被關閉
    IN_CREATE,文件/文件夾被創建
    IN_DELETE,文件/文件夾被刪除
    IN_DELETE_SELF,被監控的對象本身被刪除
    IN_MODIFY,文件被修改
    IN_MOVE_SELF,被監控的對象本身被移動
    IN_MOVED_FROM,文件被移出被監控目錄 
    IN_MOVED_TO,文件被移入被監控目錄
    IN_OPEN,文件被打開
*/
//返回值:表示對那個文件的監視

int inotify_rm_watch(int fd,uint32_t wd)//刪除監視對象
//fd:inotify_init的返回值
//wd:inotify_add_watch的返回值

//文件事件用struct inotify_event表示,通過fd由read函數來讀取
//buf是inotify_event結構的數組的指針,BUF_LEN 指定要讀取的總長度,buf的長度不能小於BUF_LEN
//read讀取到的事件數取決於BUF_LEN以及事件中文件名的長度,返回實際讀取的長度 size_t len = read (fd, buf, BUF_LEN); struct inotify_event { __s32 wd; /* watch descriptor */ __u32 mask; /* watch mask */ __u32 cookie; /* cookie to synchronize two events */ __u32 len; /* length (including nulls) of name */ char name[0]; /* stub for possible name */ };
//文件名是變長的,實際緊跟在該結構的后面,文件名被0填充以保證下一個事件結構能夠4字節對齊。
//len字段也把name的填充字段統計在內

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM