温馨提示×

Debian readdir返回值

小樊
44
2026-07-27 23:00:03
栏目: 智能运维

Debian(以及所有 Linux/Unix 系统) 中,readdirPOSIX 标准 C 库函数,用于读取目录内容。它的返回值和含义遵循 POSIX 规范,与 Debian 本身没有直接差异。

下面按 最常用情况 说明。


1. readdir 函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

2. 返回值说明

✅ 成功时

  • 返回一个指向 struct dirent 的指针
  • 该结构表示目录中的 下一个目录项
struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;       // 偏移量(非 POSIX)
    unsigned short d_reclen;    // 记录长度
    unsigned char  d_type;      // 文件类型(非 POSIX,多数 Linux 支持)
    char           d_name[256]; // 文件名
};

⚠️ 到达目录末尾(EOF)

  • 返回 NULL
  • errno 不会被设置
if (readdir(dir) == NULL) {
    // 目录读取结束
}

❌ 发生错误

  • 返回 NULL
  • errno 被设置

常见错误码:

  • EBADF:目录流无效
  • ENOENT:目录不存在
  • 其他 I/O 错误

判断方式:

errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
    if (errno != 0) {
        perror("readdir");
    } else {
        // 正常结束
    }
}

3. 典型使用示例(Debian / Linux)

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

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

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

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

    closedir(dir);
    return 0;
}

4. 需要注意的点(很重要)

readdir 不是线程安全的

  • 返回的是 静态缓冲区
  • 多线程中应使用 readdir_r(已废弃)或 readdir + 锁

✅ 会返回 ...

.
..
file1
file2

如果你不想看到它们,应手动过滤:

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

5. 延伸:readdir vs getdents

函数 说明
readdir POSIX 标准,用户态接口
getdents Linux 系统调用(底层)
readdir Debian / Linux 实际使用 getdents 实现

如果你需要的是:

  • readdir 在 Debian 特定版本的差异
  • readdirreaddir64
  • 目录遍历性能
  • d_type 在 Debian 上的可用性

可以继续问,我可以针对你的具体场景深入分析。

0