在 CentOS(本质是 Linux) 上,readdir 本身是 同步的 POSIX 接口,没有“异步 readdir”这一说。但可以通过 几种常见方式实现“异步读取目录”的效果。
下面按 推荐程度 + 实际使用场景 给你讲清楚。
这是 最稳妥、最简单 的方式。
opendir / readdir#include <pthread.h>
#include <dirent.h>
#include <stdio.h>
void* read_dir_thread(void* arg) {
DIR* dir = opendir("/var/log");
struct dirent* entry;
while ((entry = readdir(dir)) != NULL) {
printf("file: %s\n", entry->d_name);
}
closedir(dir);
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, read_dir_thread, NULL);
pthread_detach(tid);
// 主线程继续干别的事
while (1) {}
}
✅ 优点
❌ 缺点
Linux 有:
aio_*io_submit(libaio)io_uring⚠️ 但:
readdir 不在异步 I/O 支持范围内
异步 I/O 只能用于:
openreadwritefsync❌ 不能异步调用 readdir
如果你一定要用现代异步机制,可以用:
openat() → 异步getdents64() → 异步(底层系统调用)readdir 是 glibc 封装getdents64io_uring_prep_openat(sqe, AT_FDCWD, "/var/log", O_RDONLY | O_DIRECTORY, 0);
io_uring_prep_getdents(sqe, fd, buf, size);
✅ 性能好
❌ 非常复杂
❌ 不适合普通业务
如果你是:
正确做法:
epoll例如:
| 场景 | 推荐方案 |
|---|---|
| 普通程序 | 线程 + readdir |
| 高性能服务 | 线程池 |
| 内核级研究 | io_uring + getdents64 |
| CentOS 默认 | 不支持真异步 readdir |
如果你愿意,可以告诉我:
我可以直接给你可运行的完整代码。