温馨提示×

linux readdir怎么返回

小樊
43
2026-10-08 13:18:40
栏目: 智能运维

在 Linux 里,readdir 是 POSIX 目录读取函数,用来遍历一个打开的目录。下面从“函数怎么用、返回什么、怎么判断结束、示例代码”几个方面说清楚。


一、readdir 函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

  • dirp:由 opendir() 返回的目录流指针

返回值

  • 成功:返回指向 struct dirent 的指针(静态分配,下一次调用会被覆盖)
  • 到达目录末尾:返回 NULL
  • 出错:返回 NULL,并设置 errno

⚠️ 注意:
readdir 返回 NULL 时,可能是:

  • 正常结束
  • 出错
    需要用 errno 区分(见示例)

二、struct dirent 结构(常用字段)

struct dirent {
    ino_t          d_ino;     // inode 号
    off_t          d_off;     // 偏移
    unsigned short d_reclen;  // 记录长度
    unsigned char  d_type;    // 文件类型
    char           d_name[];  // 文件名
};

常用:

  • d_name:文件名(字符串)
  • d_type:文件类型(可选,有些文件系统不支持)

三、基本使用示例

#include <stdio.h>
#include <dirent.h>
#include <errno.h>

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    errno = 0;
    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    if (errno != 0) {
        perror("readdir");
    }

    closedir(dir);
    return 0;
}

四、如何判断 readdir 是“结束”还是“出错”

while ((entry = readdir(dir)) != NULL) {
    // 正常读取
}

if (errno != 0) {
    // 出错
} else {
    // 正常结束
}

五、线程安全问题(很重要)

  • readdir 不是线程安全
  • 多线程请用:
    • readdir_r(已废弃但旧系统仍有)
    • 或 readdir + 加锁
    • 或现代系统用 readdir + TLS

POSIX 推荐直接使用 readdir(现代 glibc 已内部加锁)。


六、常见坑

  1. 不要保存 dirent 指针

    // 错误
    struct dirent *p = readdir(dir);
    // 下次调用后 p 内容会变
    
  2. . 和 .. 也会返回

  3. 目录打开后一定要 closedir


七、相关函数

函数 作用
opendir 打开目录
readdir 读取一项
closedir 关闭目录
rewinddir 重新读取
seekdir / telldir 定位

如果你问的是 “readdir 在内核 / syscall 层怎么返回”(如 getdents),或者 “C++ / Python 的 readdir”,可以继续问。

0 踩