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
来监控文件系统的变化,并根据需要做出响应。