在 Linux 下使用 readdir(或更常见的 readdir() / readdir_r())时报错,通常不是函数“本身”报错,而是调用方式或环境不对导致返回 NULL 或崩溃。下面按常见原因给你梳理一下。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
readdir 返回 NULL,其实是 opendir 没成功。
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir"); // 这里才会告诉你真实错误
}
常见错误:
readdir 返回 NULL 有两种情况:
entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir"); // 真出错
} else {
// 只是目录读完了
}
}
⚠️ 注意:读目录结束是正常行为,不是错误。
readdir 不是线程安全的。
❌ 错误示例(多线程):
readdir(dir); // 可能数据竞争
✅ 正确做法:
struct dirent entry;
struct dirent *result;
readdir_r(dir, &entry, &result);
或直接使用 readdir 但加锁。
在 readdir 过程中:
可能导致:
EBADFENOENT不同系统 struct dirent 字段不同:
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};
不要手动 malloc 一个 dirent 给 readdir。
可能导致:
opendir 失败readdir 乱码✅ 永远配合 perror / errno
#include <errno.h>
if (readdir(dir) == NULL && errno != 0) {
perror("readdir");
}
strace ./your_program
可以看到:
你可以把:
发出来,我可以直接帮你定位是哪一行的问题。