inotify 是 Linux 内核提供的一种文件系统事件监控机制,它可以实时监测文件或目录的变化,如创建、删除、修改等。以下是使用 inotify 检测文件变化的步骤:
在大多数 Linux 发行版中,inotify 相关的功能已经包含在内核中,但你需要安装一些库来方便使用。例如,在 Debian/Ubuntu 系统上,你可以安装 libinotify-dev:
sudo apt-get update sudo apt-get install libinotify-dev 以下是一个简单的 C 语言示例,展示如何使用 inotify 监控文件变化:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/inotify.h> #include <unistd.h> #define EVENT_SIZE ( sizeof (struct inotify_event) ) #define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) ) int main(int argc, char **argv) { int length, i = 0; int fd; int wd; char buffer[BUF_LEN]; // 创建 inotify 实例 fd = inotify_init(); if (fd < 0) { perror("inotify_init"); return 1; } // 添加要监控的文件或目录 wd = inotify_add_watch(fd, "/path/to/your/file_or_directory", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) { perror("inotify_add_watch"); close(fd); return 1; } printf("Monitoring file or directory for changes...\n"); while (1) { length = read(fd, buffer, BUF_LEN); if (length < 0) { perror("read"); break; } while (i < length) { struct inotify_event *event = (struct inotify_event *) &buffer[i]; if (event->len) { if (event->mask & IN_MODIFY) { printf("File modified: %s\n", event->name); } if (event->mask & IN_CREATE) { printf("File created: %s\n", event->name); } if (event->mask & IN_DELETE) { printf("File deleted: %s\n", event->name); } } i += EVENT_SIZE + event->len; } i = 0; } // 移除监控并关闭文件描述符 inotify_rm_watch(fd, wd); close(fd); return 0; } 使用 gcc 编译上述代码:
gcc -o inotify_example inotify_example.c -linotify 然后运行生成的可执行文件:
./inotify_example inotify_init(): 创建一个新的 inotify 实例并返回文件描述符。inotify_add_watch(): 添加要监控的文件或目录,并指定感兴趣的事件(如 IN_MODIFY, IN_CREATE, IN_DELETE)。read(): 从 inotify 文件描述符读取事件。struct inotify_event: 包含事件信息的结构体,通过解析它可以获取事件的类型和文件名。inotify 有监控数量的限制,可以通过调整内核参数来增加限制。通过以上步骤,你可以使用 inotify 实现对文件变化的实时监控。