温馨提示×

inotify在Linux下如何处理事件

小樊
32
2025-11-10 20:29:02
栏目: 智能运维

在Linux下,inotify是一个用于监控文件系统事件的API。它允许应用程序实时地获取文件或目录的变化信息,例如文件创建、删除、修改等。要使用inotify处理事件,你需要遵循以下步骤:

  1. 包含头文件: 在你的C程序中,包含以下头文件:
#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
  1. 创建inotify实例: 使用inotify_init()函数创建一个inotify实例。这将返回一个文件描述符,用于后续操作。
int inotify_fd = inotify_init();
if (inotify_fd < 0) {
    perror("inotify_init");
    exit(EXIT_FAILURE);
}
  1. 添加监控: 使用inotify_add_watch()函数为要监控的文件或目录添加规则。这个函数需要三个参数:inotify文件描述符、要监控的文件或目录的路径以及一个事件掩码。
int watch_descriptor = inotify_add_watch(inotify_fd, "/path/to/your/file_or_directory", IN_CREATE | IN_DELETE | IN_MODIFY);
if (watch_descriptor < 0) {
    perror("inotify_add_watch");
    exit(EXIT_FAILURE);
}

事件掩码定义了要监控的事件类型,例如:

  • IN_CREATE:文件或目录被创建
  • IN_DELETE:文件或目录被删除
  • IN_MODIFY:文件被修改
  • IN_CLOSE_WRITE:文件被关闭且已写入
  1. 读取事件: 使用read()函数从inotify文件描述符中读取事件。这将返回一个事件结构体数组,其中包含了发生的事件信息。
char buffer[4096];
ssize_t length = read(inotify_fd, buffer, sizeof(buffer));
if (length < 0) {
    perror("read");
    exit(EXIT_FAILURE);
}
  1. 解析事件: 遍历事件结构体数组,解析每个事件的信息。事件结构体定义如下:
struct inotify_event {
    int wd;             /* Watch descriptor */
    uint32_t mask;      /* Mask describing event */
    uint32_t cookie;    /* Unique cookie associating related events (for rename(2)) */
    uint32_t len;       /* Size of name field */
    char name[];        /* Optional null-terminated name */
};

你可以使用mask字段检查发生了哪些事件,并根据wd字段(监视描述符)确定是哪个文件或目录触发了事件。

  1. 清理: 完成监控后,使用inotify_rm_watch()函数删除监控规则,并关闭inotify文件描述符。
inotify_rm_watch(inotify_fd, watch_descriptor);
close(inotify_fd);

这是一个简单的示例,展示了如何使用inotify处理文件系统事件。你可以根据自己的需求修改和扩展这个示例。

0