在 Linux 下,readdir() 本身不能监听目录变化。readdir() 只是“读取目录项”,是一次性的枚举操作,没有通知机制。
如果你想要“监听目录变化”,常见做法有以下几种(按推荐程度排序):
适合:监听目录内文件的创建、删除、重命名等
inotify_init() 创建实例inotify_add_watch() 监听目录read() 读取事件#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);
}
}
}
适合:安全审计、文件访问控制
CAP_SYS_ADMIN思路
opendir() + readdir()readdir() ≠ 监听readdir() 不会阻塞等待变化readdir() 不能感知文件内容变化| 方法 | 实时性 | 复杂度 | 推荐度 |
|---|---|---|---|
| inotify | 高 | 低 | ⭐⭐⭐⭐⭐ |
| fanotify | 高 | 高 | ⭐⭐⭐ |
| readdir 轮询 | 低 | 中 | ⭐ |
如果你愿意,我可以:
你是用哪种语言?