在 CentOS(Linux) 上,readdir() 本身是 同步、阻塞 的 POSIX 接口,内核并没有提供“异步 readdir”的标准函数。所谓“异步读取目录”,通常是通过 其他方式模拟或借助异步 I/O 机制 来实现。
下面给你几种在 CentOS 上可行的方案,从简单到高级。
这是 最推荐、最稳定 的方式。
opendir() / readdir()#include <pthread.h>
#include <dirent.h>
#include <stdio.h>
void* read_dir(void* arg) {
DIR* dir = opendir((char*)arg);
struct dirent* entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, read_dir, "/var/log");
pthread_detach(tid);
// 主线程继续干别的事
while (1) {}
}
✅ 优点
❌ 缺点
libuv(Node.js / 现代 C/C++ 常用)如果你在做 网络服务 / 事件循环,这是最佳方案。
uv_fs_t req;
uv_fs_readdir(uv_default_loop(), &req, "/var/log", 0, NULL);
CentOS 8 / Stream 支持 io_uring
openat + getdents64io_uring 提交 openatgetdents64⚠️ 注意
readdir() 不能直接用getdents64()(底层系统调用)io_uring_prep_openat(sqe, -1, "/var/log", O_RDONLY | O_DIRECTORY, 0);
io_uring_prep_getdents(sqe, fd, buf, size);
✅ 真正异步
❌ 复杂度高,内核版本要求高
inotify + 后台扫描(特殊场景)如果你只是想 “目录变化不阻塞”:
inotify 监听适合:
❌ aio_read 读目录(不支持)
❌ select/poll 监听目录 fd(不可靠)
❌ 指望 readdir 变成非阻塞(不可能)
| 场景 | 推荐 |
|---|---|
| 通用程序 | 线程 + readdir |
| 网络服务 | libuv |
| 高性能存储 | io_uring |
| 文件监控 | inotify |
如果你能告诉我:
我可以直接给你 可编译的完整示例。