在 Debian(以及其它 Linux 系统)里,readdir 和 readdir 看起来名字一样,但通常你问的可能是下面几种“容易混淆”的情况之一。我分别说明:
readdir(单线程 / 基础函数)头文件:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp);
特点:
struct dirent * 是 静态分配的内存示例:
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
readdir_r(线程安全版本)函数原型:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
特点:
struct dirent 缓冲区0 成功,*result == NULL 表示结束示例:
struct dirent entry;
struct dirent *result;
while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
printf("%s\n", entry.d_name);
}
readdir vs readdir_r(核心区别)| 对比项 | readdir | readdir_r |
|---|---|---|
| 线程安全 | ❌ 否 | ✅ 是 |
| 内存来源 | 静态内存 | 用户提供 |
| 使用难度 | 简单 | 稍复杂 |
| 当前状态 | 推荐使用 | 已废弃 |
readdir → C 库函数getdents / getdents64 → 真正的系统调用readdir 内部最终调用 getdents64✅ 现代程序推荐:
readdirreaddir + 加锁,或 std::filesystem(C++17)❌ 不推荐新代码使用 readdir_r
如果你指的是 “某个具体命令(如 ls)里的 readdir” 或 “内核里的 readdir”,可以告诉我具体场景,我可以进一步解释。