在 Linux 中,readdir(以及底层系统调用 getdents / getdents64)本身没有一个固定“官方规定”的缓冲区大小,缓冲区大小通常由调用者(C 库或你的程序)决定。
下面分层说明:
readdir 是 glibc 封装函数readdir() 来自 POSIX,在 Linux 上由 glibc 实现:
readdir 内部会调用 getdents6432768 字节(32 KB)
这是 glibc 的实现细节(不同版本可能略有差异,但 32KB 是常见值)。你无法直接控制 readdir 的缓冲区大小,除非你自己用 getdents / opendir + readdir_r 等更底层方式。
getdents / getdents64int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
count 参数就是缓冲区大小⚠️ 注意:
getdents 可能一次只返回部分结果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;
readdir,不用关心缓冲区getdents64
readdir在 Linux 上默认缓冲区通常是 32KB(glibc 实现),真实大小由调用者决定;底层getdents没有固定上限,但需要自己控制。
如果你愿意,我可以:
getdents64 示例代码