温馨提示×

linux readdir缓冲区多大

小樊
48
2026-09-26 20:15:41
栏目: 智能运维

在 Linux 中,readdir(以及底层系统调用 getdents / getdents64)本身没有一个固定“官方规定”的缓冲区大小,缓冲区大小通常由调用者(C 库或你的程序)决定。

下面分层说明:


1. readdir 是 glibc 封装函数

readdir() 来自 POSIX,在 Linux 上由 glibc 实现:

  • readdir 内部会调用 getdents64
  • glibc 默认使用的缓冲区大小一般是:
    32768 字节(32 KB)
    
    这是 glibc 的实现细节(不同版本可能略有差异,但 32KB 是常见值)。

你无法直接控制 readdir 的缓冲区大小,除非你自己用 getdents / opendir + readdir_r 等更底层方式。


2. 底层系统调用:getdents / getdents64

int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
  • count 参数就是缓冲区大小
  • 上限受以下限制:
    • 内核通常接受 最大 1 页(4KB)到多页
    • 实际常用值:
      • 4 KB
      • 32 KB
      • 甚至更大(取决于程序和内核)

⚠️ 注意:

  • 如果目录项很多,getdents 可能一次只返回部分结果
  • 需要循环调用直到返回 0

3. readdir_r(已废弃但可控)

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
  • 需要你提供 struct dirent 缓冲区
  • 大小要足够大(尤其文件名很长时)
  • 常见写法:
    size_t name_max = pathconf(dirname, _PC_NAME_MAX);
    size_t buf_size = offsetof(struct dirent, d_name) + name_max + 1;
    

4. 实际建议

  • 普通程序:直接用 readdir,不用关心缓冲区
  • 高性能场景:
    • 自己调用 getdents64
    • 缓冲区用 32KB ~ 128KB
  • 海量小文件目录:
    • 避免单目录过多文件(>10万)
    • 或分批/并发遍历

5. 一句话总结

readdir 在 Linux 上默认缓冲区通常是 32KB(glibc 实现),真实大小由调用者决定;底层 getdents 没有固定上限,但需要自己控制。

如果你愿意,我可以:

  • 给你一个 getdents64 示例代码
  • 或分析某个目录遍历性能问题

0 踩