温馨提示×

debian readdir和readdir区别

小樊
40
2026-09-19 12:09:45
栏目: 智能运维

在 Debian(以及其它 Linux 系统)里,readdirreaddir 看起来名字一样,但通常你问的可能是下面几种“容易混淆”的情况之一。我分别说明:


1. 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);

2. readdir_r(线程安全版本)

函数原型:

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

特点:

  • 线程安全
  • 需要你自己提供 struct dirent 缓冲区
  • 返回值:0 成功,*result == NULL 表示结束
  • 在较新 glibc 中 已被标记为 deprecated

示例:

struct dirent entry;
struct dirent *result;
while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
    printf("%s\n", entry.d_name);
}

3. readdir vs readdir_r(核心区别)

对比项 readdir readdir_r
线程安全 ❌ 否 ✅ 是
内存来源 静态内存 用户提供
使用难度 简单 稍复杂
当前状态 推荐使用 已废弃

4. 你可能还混淆的:系统调用 vs 库函数

  • readdirC 库函数
  • getdents / getdents64真正的系统调用
  • readdir 内部最终调用 getdents64

5. Debian 上的建议

现代程序推荐:

  • 单线程:直接用 readdir
  • 多线程:使用 readdir + 加锁,或 std::filesystem(C++17)

❌ 不推荐新代码使用 readdir_r


如果你指的是 “某个具体命令(如 ls)里的 readdir”“内核里的 readdir”,可以告诉我具体场景,我可以进一步解释。

0