温馨提示×

linux readdir返回什么内容

小樊
41
2026-09-14 19:03:37
栏目: 智能运维

在 Linux 中,readdir 通常指 POSIX 标准库函数 readdir(),用来读取目录中的条目。下面分几点说明它“返回什么内容”。


1. readdir 函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • 参数:DIR *dirp —— 由 opendir() 返回的目录流指针
  • 返回值:
    • 成功:指向 struct dirent 的指针
    • 到达目录末尾:返回 NULL
    • 出错:返回 NULL,并设置 errno

2. 返回的内容:struct dirent

readdir 返回的是一个 struct dirent 结构体(具体字段可能因系统略有不同,但常见如下):

struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;       // 下一个条目的偏移量(Linux 特有)
    unsigned short d_reclen;    // 记录长度
    unsigned char  d_type;      // 文件类型(Linux 特有)
    char           d_name[256]; // 文件名(以 '\0' 结尾)
};

常用字段说明

  • d_name:最重要,文件名(不含路径)
  • d_ino:文件的 inode 号
  • d_type:文件类型(可选值见下)
  • d_off / d_reclen:底层实现相关,一般不用

3. d_type 常见取值

DT_REG   普通文件
DT_DIR   目录
DT_LNK   符号链接
DT_CHR   字符设备
DT_BLK   块设备
DT_FIFO  管道
DT_SOCK  socket
DT_UNKNOWN 未知

注意:d_type 不是所有文件系统都支持,某些情况下会是 DT_UNKNOWN


4. 使用示例

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

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        printf("name: %s, type: %d\n", entry->d_name, entry->d_type);
    }

    closedir(dir);
    return 0;
}

5. 常见注意点

  • readdir 返回的是静态缓冲区指针,不能跨调用保存
    • 下一次 readdir 会覆盖内容
  • 线程安全版本:readdir_r(已逐渐废弃)
  • 现代推荐:POSIX.1-2008 的 readdir 在多数实现中已是线程安全(配合不同 DIR*)

6. 总结一句话

readdir 返回的是目录中一个条目的元信息(主要是文件名和类型),以 struct dirent * 形式给出,到目录末尾或出错时返回 NULL。

如果你问的是 系统调用 getdents / getdents64,或者 Shell 中的 readdir 概念,也可以继续问。

0 踩