在 CentOS(本质是 Linux)上,“readdir 如何缓存”这个问题可以从不同层级来理解。下面按常见场景给你梳理一下。
readdir() 是 glibc 提供的系统调用封装,用于读取目录项。
opendir() 会分配一个 目录流 bufferreaddir() 并不是每次都进内核,而是:
getdents() 从内核批量取示例:
DIR *dir = opendir("/data");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ 这是 进程内、短期缓存,目录关闭即失效。
Linux 内核维护了:
如果你反复 readdir 同一个目录:
查看缓存情况:
free -h
cat /proc/slabinfo | grep dentry
清理缓存(不推荐生产用):
sync
echo 2 > /proc/sys/vm/drop_caches
✅ 这是 系统级、全局缓存
| 文件系统 | 缓存能力 |
|---|---|
| ext4 | 强 |
| xfs | 强 |
| NFS | 依赖 actimeo |
| overlayfs | 依赖底层 |
NFS 示例(CentOS 常见):
mount -o actimeo=60 nfs-server:/data /mnt
如果是 频繁 readdir、目录变化不频繁,可以自己缓存。
char **cache_dir(const char *path) {
// 读取目录,存到数组
}
inotifywait -m /data
目录变化时刷新缓存。
一般无需改,除非极端性能场景。
如:
cachefilesdfscache适合 NFS / 网络存储。
systemd 调优readdir 本身不缓存,但 Linux 内核通过 dentry / inode cache 自动缓存目录读取;应用层如需更久缓存,应自行实现并配合 inotify 失效。
如果你愿意,可以告诉我:
我可以给你更具体的方案或代码示例。