inotify
是 Linux 內核提供的一種文件系統事件監控機制,它允許應用程序實時監控文件或目錄的變化,如創建、刪除、修改等。inotify
API 提供了一組系統調用,使應用程序能夠創建、管理和讀取 inotify
實例。
以下是 inotify
API 的基本工作原理:
首先,應用程序需要調用 inotify_init
或 inotify_init1
系統調用來創建一個 inotify
實例。這個實例將用于監控文件或目錄的事件。
#include <sys/inotify.h>
int fd = inotify_init();
if (fd == -1) {
// 處理錯誤
}
接下來,應用程序使用 inotify_add_watch
系統調用來添加對特定文件或目錄的監控??梢灾付ㄒO控的事件類型,如 IN_CREATE
、IN_DELETE
、IN_MODIFY
等。
int wd = inotify_add_watch(fd, "/path/to/file_or_directory", IN_CREATE | IN_DELETE | IN_MODIFY);
if (wd == -1) {
// 處理錯誤
}
一旦設置了監控,應用程序可以通過讀取 inotify
實例的文件描述符來獲取事件通知。通常使用 read
系統調用來讀取事件。
char buffer[4096];
ssize_t length = read(fd, buffer, sizeof(buffer));
if (length > 0) {
// 處理事件
}
讀取到的數據是一個或多個 inotify_event
結構體的序列。每個 inotify_event
結構體包含有關事件的信息,如事件類型、文件名等。
struct inotify_event *event = (struct inotify_event *)buffer;
while (length > 0) {
if (event->mask & IN_CREATE) {
// 文件或目錄被創建
}
if (event->mask & IN_DELETE) {
// 文件或目錄被刪除
}
if (event->mask & IN_MODIFY) {
// 文件或目錄被修改
}
// 移動到下一個事件
length -= sizeof(struct inotify_event) + event->len;
event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len);
}
當不再需要監控某個文件或目錄時,可以使用 inotify_rm_watch
系統調用來移除監控。
int ret = inotify_rm_watch(fd, wd);
if (ret == -1) {
// 處理錯誤
}
最后,當應用程序不再需要 inotify
實例時,應該調用 close
系統調用來關閉它。
close(fd);
inotify
實例的數量和每個實例可以監控的文件描述符數量都是有限的,具體限制可以通過 /proc/sys/fs/inotify/max_user_instances
和 /proc/sys/fs/inotify/max_user_watches
查看和調整。inotify
事件通知是基于事件的,可能會有一定的延遲,具體取決于系統負載和其他因素。通過以上步驟,應用程序可以有效地使用 inotify
API 來監控文件系統的變化,并根據需要做出相應的響應。