温馨提示×

ubuntu readdir为何报错

小樊
48
2026-09-27 19:46:25
栏目: 智能运维

在 Ubuntu(Linux)下使用 readdir 报错,常见原因和排查思路如下。先说明一点:readdir 本身不会“凭空报错”,通常是参数错误、目录未打开、或头文件/链接问题导致的。


一、最常见的几种原因

1️⃣ 没有先 opendir

readdir 必须作用于 DIR *,不能直接传普通指针。

❌ 错误示例:

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

✅ 正确示例:

#include <dirent.h>

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

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

closedir(dir);

2️⃣ 目录路径不存在或权限不足

opendir 返回 NULL,但你没检查,导致后面 readdir 段错误(Segmentation fault)。

检查方式:

ls -ld /your/path

代码中一定要:

if (dir == NULL) {
    perror("opendir");
}

3️⃣ 忘记包含头文件

缺少头文件会导致隐式声明,编译期或运行期异常。

必须包含:

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

4️⃣ 对 readdir 的返回值判断错误

readdir 出错和结束都返回 NULL,需要看 errno:

#include <errno.h>

errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
    perror("readdir");
}

5️⃣ 多线程环境下使用 readdir

⚠️ readdir 不是线程安全函数

  • 多线程中应使用:
    • readdir_r(已逐步淘汰)
    • 或 readdir + 加锁
    • 或直接使用 scandir / getline 等替代方案

6️⃣ 编译时未链接标准库(一般不会)

C 程序通常不需要额外链接,但确认:

gcc test.c -o test

如果是 C++:

g++ test.cpp -o test

二、典型报错对照表

报错现象 原因
Segmentation fault dir 为 NULL
implicit declaration 没 include <dirent.h>
No such file or directory 路径错误
Permission denied 权限不足
readdir: Bad file descriptor 目录已 closedir

三、最小可运行示例(Ubuntu 测试通过)

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

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

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

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

    closedir(dir);
    return 0;
}

四、如果你愿意

你可以直接贴出:

  • 报错信息(终端完整输出)
  • 你的代码片段

我可以精准指出是哪一行、为什么报错。

0 踩