在 CentOS(以及一般的 Linux 系统)里,readdir 相关的“限制”主要来自 内核、文件系统、glibc、以及系统资源 几个层面。下面按常见关注点说明:
readdir() / readdir_r() 是 逐条读取目录项 的接口:
struct dirent *✅ 理论上:目录里 100 万、1000 万个文件都能读
❌ 但性能和资源会成为瓶颈
ext4、xfs 等支持大目录readdir 越慢常见经验值:
readdir 底层是:
getdents / getdents64
可通过:
strace ls /bigdir
看到 getdents64(..., size) 的调用
虽然 readdir 只用一个 DIR *,但如果:
opendir 后不 closedir会触发:
Too many open files
查看:
ulimit -n
readdir 不会一次加载全部目录while(readdir) 把结果全部存数组
→ 内存爆炸readdir_r 已不推荐d_ino、off_t 可能溢出| 现象 | 真实原因 |
|---|---|
| readdir 很慢 | 目录太大 |
| 读不全 | 程序逻辑错误 / 提前 break |
| 崩溃 | 内存爆了 |
| 报错 | fd 用尽 |
getdents + 分批如果你说的是:
可以贴出来,我可以更精确判断“限制到底在哪”。