inotify
是 Linux 内核提供的一种文件系统事件监控机制,它允许应用程序实时监控文件或目录的变化,如创建、删除、修改等。以下是使用 inotify
处理事件的基本步骤:
首先,需要包含必要的头文件并初始化 inotify
实例。
#include <sys/inotify.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { int fd = inotify_init(); if (fd < 0) { perror("inotify_init"); exit(EXIT_FAILURE); } // 继续处理... }
使用 inotify_add_watch
函数来添加对特定文件或目录的监控。
int wd = inotify_add_watch(fd, "/path/to/file_or_directory", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) { perror("inotify_add_watch"); close(fd); exit(EXIT_FAILURE); }
这里的 IN_MODIFY
, IN_CREATE
, IN_DELETE
是你想要监控的事件类型。你可以根据需要组合多个事件。
使用 read
系统调用从 inotify
文件描述符中读取事件。
char buffer[4096]; ssize_t length = read(fd, buffer, sizeof(buffer)); if (length < 0) { perror("read"); close(fd); exit(EXIT_FAILURE); } // 解析 buffer 中的事件
inotify
返回的事件数据格式比较复杂,需要解析。每个事件由一个或多个 struct inotify_event
结构体组成。
struct inotify_event *event = (struct inotify_event *)buffer; while (length >= sizeof(struct inotify_event)) { if (event->len) { if (event->mask & IN_CREATE) { printf("File %s was created\n", event->name); } if (event->mask & IN_DELETE) { printf("File %s was deleted\n", event->name); } if (event->mask & IN_MODIFY) { printf("File %s was modified\n", event->name); } } length -= sizeof(struct inotify_event) + event->len; event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len); }
完成监控后,记得关闭 inotify
文件描述符并移除监控。
close(fd);
inotify
有监控数量的限制,可以通过调整内核参数 /proc/sys/fs/inotify/max_user_watches
来增加。通过以上步骤,你可以在 Linux 系统中使用 inotify
来监控文件系统的变化,并根据需要做出响应。