温馨提示×

ubuntu readdir错误码怎么看

小樊
48
2026-10-03 16:15:53
栏目: 智能运维

在 Ubuntu(Linux)下,readdir 相关错误通常通过 errno 来判断。下面系统地给你讲一下怎么“看” readdir 的错误码。


一、readdir 返回值和 errno 的基本规则

1. readdir 原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

2. 返回值含义

  • 非 NULL:成功读取一个目录项
  • NULL:
    • 到达目录末尾(正常情况)
    • 发生错误(需要看 errno)

⚠️ 注意:
readdir 返回 NULL 不一定是错误


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

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

DIR *dir = opendir("/some/path");
if (!dir) {
    perror("opendir");
    return;
}

errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
    if (errno != 0) {
        perror("readdir");
        // 这里才是真正的错误
    } else {
        // 正常遍历结束
    }
}

✅ 关键点:
调用 readdir 前先 errno = 0


三、常见 readdir 错误码(errno)

errno 含义 常见原因
EBADF 无效的文件描述符 DIR 指针已被 closedir
ENOENT 目录不存在 目录被删除
EACCES 权限不足 无读权限
ENOMEM 内存不足 系统内存紧张
EIO I/O 错误 磁盘/文件系统故障
EOVERFLOW 文件太大 32/64 位不兼容

四、用 strerror / perror 看错误信息

1. perror(最常用)

perror("readdir");

输出示例:

readdir: Permission denied

2. strerror

#include <string.h>
#include <errno.h>

printf("errno = %d: %s\n", errno, strerror(errno));

五、readdir_r / readdir64 的区别(进阶)

  • readdir:非线程安全
  • readdir_r:线程安全(已逐渐废弃)
  • readdir64:大文件系统(>2GB)

错误码含义基本一致。


六、调试建议(实战)

1. 打开 errno 调试

strace -e trace=readdir,getdents ./your_program

2. 查看目录权限

ls -ld /path

3. 检查是否已被 closedir

closedir(dir);
readdir(dir); // ❌ EBADF

七、一个完整示例

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

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

    struct dirent *entry;
    while (1) {
        errno = 0;
        entry = readdir(dir);
        if (!entry) {
            if (errno) {
                perror("readdir");
                break;
            } else {
                printf("end of directory\n");
                break;
            }
        }
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

如果你愿意,可以:

  • 贴出你的 代码片段
  • 或具体的 errno 数值 / 错误信息

我可以帮你精确分析是哪一类问题。

0 踩