在 Linux 下,readdir 相关的函数和“版本差异”主要涉及 不同标准/实现、不同年份的 POSIX 规范、以及 glibc 的不同版本。下面系统地给你梳理一下。
readdir 相关的几个函数Linux 中常见的目录读取函数有:
readdir()readdir_r()(线程安全版本,已废弃)readdir64() / readdir64_r()(大文件 / 64 位 inode)getdents() / getdents64()(系统调用层)readdir()readdir() 不是线程安全的示例:
struct dirent *readdir(DIR *dirp);
readdir()readdir_r()readdir() 在单线程内顺序调用是安全的readdir vs readdir_r(重要差异)readdir(传统)struct dirent *readdir(DIR *dirp);
readdir_r(已废弃)int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
readdir() 内部使用锁readdir_r() 可用但不推荐readdir_r() 的实现readdir() 成为唯一推荐方式warning: readdir_r is deprecated
✅ 结论:
现代 Linux 程序应只使用
readdir()
readdir vs readdir64)在 32 位系统上:
| 函数 | 说明 |
|---|---|
readdir |
32 位 inode |
readdir64 |
64 位 inode(支持大文件系统) |
64 位系统:
readdir 实际已是 readdir64宏定义常见:
#define readdir readdir64
用户态:
readdir()
内核态:
getdents()
getdents64() // 现代 Linux
getdents64 支持:
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ glibc 2.34+ ✅ POSIX.1-2008 ✅ 线程安全(单线程顺序调用)
❌ “readdir_r 更安全”
✅ 实际反而更容易出错
❌ “必须加锁才能用 readdir”
✅ glibc 已内部加锁
❌ “不同 Linux 发行版 readdir 行为不同”
✅ 只要 glibc 版本一致,行为一致
如果你愿意,我可以:
你更关心哪一块?