在 CentOS 上遇到 readdir 兼容性问题,通常集中在 glibc 版本差异、32/64 位、文件系统类型、以及程序编译环境 这几个方面。下面系统说明常见问题和解决办法。
在 Linux/C 中,常见有:
readdir():返回 struct dirent *readdir_r():已废弃(glibc 2.24+ 不推荐)readdir64() / readdir64_r():大文件 / inode > 32 位问题表现
symbol readdir64, version GLIBC_2.2 not defined
undefined reference to `readdir@GLIBC_2.2'
✅ 解决
readdir_rCentOS 8(glibc ≥ 2.24)中:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
⚠️ 已标记为 deprecated
问题
✅ 解决
struct dirent *de;
while ((de = readdir(dir)) != NULL) {
...
}
readdir() 在 glibc 中是线程安全的(内部加锁)
问题
d_ino 类型不一致✅ 解决
readdir64()(必要时)某些文件系统:
问题
de->d_type == DT_UNKNOWN
✅ 解决
stat() 判断文件类型d_type✅ 解决
readdir64_FILE_OFFSET_BITS=64#define _FILE_OFFSET_BITS 64
gcc -D_FILE_OFFSET_BITS=64 -o test test.c
✅ 是否在低版本 CentOS 编译?
✅ 是否使用了 readdir_r?
✅ 是否混用 32/64 位?
✅ 是否依赖 d_type?
✅ 是否跨 glibc 版本运行?
如果你能补充:
我可以给你针对你场景的精确解决方案。