在 Debian(或者说 Linux 通用)环境下,readdir 的缓存通常不是一个“单独调用 readdir 就自带缓存”的事情,而是由内核、文件系统、C 库及应用层共同决定的。下面按层次说明常见做法和机制。
struct dentry)readdir 返回的目录项,很多来自 dcache查看缓存状态:
cat /proc/slabinfo | grep dentry
清空缓存(测试用):
sync
echo 2 > /proc/sys/vm/drop_caches
ext4 / xfs / btrfs 等都受益readdir 非常快(除非目录超大)mount -o actimeo=60 nfs-server:/path /mnt
readdirplus 可加速目录遍历mount -o rdirplus
mount -o cache=strict
getdents vs readdirreaddir 是 glibc 封装如果你多次 opendir + readdir,每次都会重新读。
如果你希望“避免频繁 readdir”,可以自己缓存:
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir))) {
// 存到 vector / hash / list
}
closedir(dir);
然后:
getdents64 批量读syscall(SYS_getdents64, fd, buf, size);
readdir 快很多inotify 监听目录变化inotifywait -m /path
readdir 只作为兜底❌ “readdir 会自动缓存很久”
✅ 只有内核缓存,应用每次都要系统调用
❌ “close(dir) 后缓存还在”
✅ glibc 不保留目录内容
❌ “目录越大 readdir 越慢是必然”
✅ 很多时候是缓存未命中或 NFS 导致
例如:
我可以直接给你最优缓存策略或示例代码。