在 CentOS(Linux) 上,readdir() 本身是 同步、阻塞 的,标准 C 库并没有提供“异步 readdir”的接口。如果你需要在 CentOS 上“异步读取目录”,通常有下面几种可行方案。
这是最普遍、最稳定的做法。
opendir / readdir#include <pthread.h>
#include <dirent.h>
#include <stdio.h>
void* read_dir_thread(void* arg) {
const char* path = arg;
DIR* dir = opendir(path);
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_thread, "/tmp");
pthread_detach(tid);
// 主线程继续干活
while (1) {}
}
✅ 优点
❌ 缺点
io_uring 是 Linux 5.1+ 提供的异步 I/O 框架
CentOS 8 / Stream 支持(需内核 ≥ 5.x)
readdir 本身 不能直接异步openat()getdents64()(底层系统调用)io_uring 提交io_uring_prep_openat(sqe, AT_FDCWD, "/tmp", O_RDONLY | O_DIRECTORY, 0);
io_uring_prep_read(sqe, fd, buf, size, 0); // getdents64
✅ 优点
❌ 缺点
getdents64,不是 readdir适合“目录变化”而不是“遍历”。
int fd = inotify_init1(IN_NONBLOCK);
inotify_add_watch(fd, "/tmp", IN_CREATE | IN_DELETE);
配合 epoll 使用。
✅ 适合
如果你用 Node.js / C / C++ 异步框架:
uv_fs_scandir()uv_fs_scandir(loop, &req, path, 0, cb);
✅ 跨平台
✅ 内部线程池
❌ 引入第三方库
| 场景 | 推荐方案 |
|---|---|
| 简单程序 | 线程 + readdir |
| 高并发服务 | io_uring |
| 目录监听 | inotify + epoll |
| 跨平台 | libuv |
如果你愿意,可以告诉我:
cat /etc/centos-release)我可以给你更精确的代码模板。