温馨提示×

ubuntu readdir为什么会报错

小樊
35
2026-10-15 09:26:54
栏目: 智能运维

在 Ubuntu(Linux)下,readdir 报错通常和用法、目录句柄、权限或环境有关。下面按“最常见原因 → 解释 → 解决办法”来说明。


一、readdir 是什么

readdir 是 POSIX 标准函数,用来读取目录内容:

#include <dirent.h>

DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);

二、最常见的报错原因

1️⃣ 没有先 opendir

错误示例:

DIR *dir;
readdir(dir);  // dir 未初始化

✅ 正确:

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

2️⃣ opendir 失败(最常见)

readdir 返回 NULL 不代表一定是 readdir 错,往往是 opendir 就失败了。

常见原因:

  • 目录不存在
  • 权限不足
  • 路径是文件而不是目录

检查方式:

perror("opendir");

Ubuntu 常见错误:

Permission denied
No such file or directory
Not a directory

3️⃣ 把 readdir 返回值当错误

很多人误以为:

if (!readdir(dir)) {
    // 错误
}

❌ 这是错误的

  • readdir 返回 NULL 表示:
    • 读完了
    • 或出错了

✅ 正确判断方式:

errno = 0;
struct dirent *entry = readdir(dir);
if (!entry) {
    if (errno != 0) {
        perror("readdir");
    }
}

4️⃣ 目录被并发删除 / 卸载

在 Ubuntu 上:

  • 目录被 rm -rf
  • U 盘被拔出
  • 网络目录(NFS)断开

会导致:

EBADF
ENOENT

解决:

  • 保证目录在遍历期间存在
  • 避免遍历 /mnt、/media 等易变路径

5️⃣ 多线程中使用同一个 DIR*

readdir 不是线程安全的(Ubuntu 默认)

❌ 错误:

// 多个线程共用同一个 dir
readdir(dir);

✅ 解决:

  • 每个线程 opendir
  • 或用 readdir_r(已废弃但仍可用)
  • 或加锁

6️⃣ 在 C++ 中混用方式

比如:

  • 用 std::filesystem
  • 又用 readdir

容易:

  • 资源未释放
  • double close

建议:

  • C → opendir/readdir/closedir
  • C++17 → std::filesystem::directory_iterator

7️⃣ 编译没加头文件

缺少:

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

可能表现:

  • 隐式声明
  • 随机段错误

三、最小可用示例(Ubuntu)

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

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

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

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

    closedir(dir);
    return 0;
}

四、如果你愿意,我可以更精准帮你

你可以贴:

  1. 完整报错信息
  2. 代码片段
  3. 是 C / C++ / Python / Shell?

我可以直接指出是哪一行导致 readdir 报错。

0 踩