inotify和epoll結合使用的小例子

2021-07-31 13:53:18 字數 2871 閱讀 5105

個人能力有限,文中有不當和錯誤給您帶來的不便還請諒解。

用inotify可以檢測檔案系統中檔案和目錄發生的變化,而epoll可以同時檢測多個檔案。這裡將epoll和inotify結合起來使用,測試這樣一種情況:指定相應目錄,當目錄中有檔案建立或者刪除時有相應的通知資訊並把檔案新增或者移除epoll的檢測機制,當檔案可讀時,通過epoll機制將指定的檔案的內容讀取出來。

基於這個功能實現的例子如下所示:

#include #include #include #include #include #include #include #include #include #define buffer_size		512		// 定義緩衝區的大小

#define array_length 128 // 定義陣列的長度

#define name_length 128 // 定義檔名長度的限制

/* 定義epoll最大監聽的檔案數量 */

#define epoll_max_events 32

/* 定義乙個結構體用來存放乙個檔案對應的檔案描述符和檔名 */

struct file_name_fd_desc ;

/* 定義乙個epoll事件的陣列,用來存放監聽檔案的資訊 */

static struct epoll_event g_pendingeventitems[epoll_max_events];

/* 定義乙個陣列用來存放對應檔案的檔案描述符和檔名 */

static struct file_name_fd_desc g_file_name_fd_desc[array_length];

static int array_index = 0;

/* 定義乙個存放基目錄冊指標 */

static char *base_dir;

/* * 向epoll當中新增乙個要監視的檔案

*/static int add_to_epoll(int epoll_fd, int fd)

/* * 將指定檔案從epoll中刪除

*/static void remove_from_epoll(int epoll_fd, int fd)

/* * 通過檔案描述符獲得檔名

*/static int get_name_from_fd(int fd, char **name)

} return -1;

}/* inotify 監聽事件的訊息處理機制:

* a、當建立乙個檔案時,把這個檔案新增到epoll的監測檔案當中

* b、當刪除乙個檔案時,把這個檔案從epoll的監測檔案當中移除

*/static int inotify_ctl_info(int inotify_fd, int epoll_fd)

/* 將獲得的inotify資訊列印出來 */

while(result >= (int)sizeof(*event))

add_to_epoll(epoll_fd, tmp_fd); // 將建立的檔案加入到epoll當中

/* 將檔案描述符fd關聯起來 */

g_file_name_fd_desc[array_index].fd = tmp_fd;

if(array_length == array_index)

array_index += 1;

printf("add file to epoll : %s\n", event->name);

} else // 刪除乙個檔案時}}

}event_size = sizeof(*event) + event->len;

result -= event_size;

event_pos += event_size;

} return 0;

}/* 檢測指定目錄 : 有檔案被建立或者刪除,有檔案可以讀出資料

* a. 當在指定目錄下建立檔案時, 會立刻監測到,並且使用epoll監測該檔案

* b. 當檔案有資料時,讀出資料

* c. 當指定目錄下檔案被刪除時,會立刻監測到,並且把它從epoll中移除不再監測

* usage : inotify_epoll */

int main(int argc, char *argv)

/* 將傳入的引數作為基目錄 */

base_dir = argv[1];

/* 開啟乙個epoll檔案的檔案描述符 */

epoll_fd = epoll_create(1); // 傳入的引數可以隨意,只要大於0即可,沒有什麼具體意思

if(-1 == epoll_fd)

/* 初始化乙個inotify的例項,獲得乙個該例項的檔案描述符 */

inotify_fd = inotify_init();

/* 新增乙個用於監視的目錄:主要監視該目錄中檔案的新增和移除 */

result = inotify_add_watch(inotify_fd, base_dir, in_delete | in_create);

if(-1 == result)

/* 將inotify_fd將入到epoll當中 */

add_to_epoll(epoll_fd, inotify_fd);

/* 通過迴圈來處理不同情況 */

while(1)

else

}else // 非inotify事件,則把檔案的內容讀取出來}}

} }return 0;

}

編譯並執行,測試結果如下:

Linux 用inotify監聽檔案和目錄

日常應用中,常常會遇到以下場景,監控資料夾a,若資料夾中的b檔案發生變化,則執行c命令。linux下可以通過inotify完成該功能。自從linux kernel 2.6.13起,inotify以作為核心的一部份,同時需要glibc 2.4以上版本。1.相關函式 inotify init 建立乙個i...

inotify實時同步工具理論和實戰

inotify服務 當使用者在a伺服器上操作了資料,inotify 會抓取出來,然後通知 rsync 然後同步到 rsync 伺服器。所以 inotify 伺服器卻是 rsync 的客戶端伺服器。inotify效能比 sersync 強,inotify 可能支援幾百個,sersync 可能一百所以就...

epoll的安裝和除錯

又是一件折騰了我一天的事情。其實epoll 早就會寫了,lib裡面早就支援了epoll,但一直停留在 支援 階段。實際上卻是沒有用起來過。公司裝了一台機器,裡面有epoll.h和epoll.a,但核心卻不是2.6,所以機器上能編譯但不能執行。另外一台機器公升級了核心,但卻怎麼也找不到epoll.h和...