温馨提示×

linux readdir如何监听变化

小樊
48
2026-10-05 14:47:16
栏目: 智能运维

在 Linux 下,readdir() 本身不能监听目录变化。readdir() 只是“读取目录项”,是一次性的枚举操作,没有通知机制。

如果你想要“监听目录变化”,常见做法有以下几种(按推荐程度排序):


✅ 推荐方式一:inotify(最常用,用户态)

适合:监听目录内文件的创建、删除、重命名等

核心思路

  • 用 inotify_init() 创建实例
  • 用 inotify_add_watch() 监听目录
  • 用 read() 读取事件

示例(C)

#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = inotify_init();
    int wd = inotify_add_watch(fd, "/tmp", IN_CREATE | IN_DELETE | IN_MODIFY);

    char buf[4096];
    while (1) {
        int len = read(fd, buf, sizeof(buf));
        struct inotify_event *ev = (struct inotify_event *)buf;
        for (char *p = buf; p < buf + len; p += sizeof(struct inotify_event) + ev->len) {
            ev = (struct inotify_event *)p;
            if (ev->mask & IN_CREATE) printf("create: %s\n", ev->name);
            if (ev->mask & IN_DELETE) printf("delete: %s\n", ev->name);
        }
    }
}

特点

  • ✅ 简单、稳定
  • ❌ 只能监听已存在的目录
  • ❌ 有 watch 数量限制(/proc/sys/fs/inotify/max_user_watches)

✅ 方式二:fanotify(更高级,需权限)

适合:安全审计、文件访问控制

  • 比 inotify 更底层
  • 可以拦截文件访问
  • 通常需要 CAP_SYS_ADMIN

⚠️ 方式三:轮询 readdir(不推荐)

思路

  • 定时 opendir() + readdir()
  • 对比前后结果差异

缺点

  • CPU 占用高
  • 有延迟
  • 无法区分“内容修改”和“元数据变化”

❌ 错误认知澄清

  • readdir() ≠ 监听
  • readdir() 不会阻塞等待变化
  • readdir() 不能感知文件内容变化

总结对比

方法 实时性 复杂度 推荐度
inotify 高 低 ⭐⭐⭐⭐⭐
fanotify 高 高 ⭐⭐⭐
readdir 轮询 低 中 ⭐

如果你愿意,我可以:

  • 给你 Python / Go / Rust 的监听示例
  • 讲解 inotify 事件掩码
  • 帮你设计 递归目录监听方案

你是用哪种语言?

0 踩