readdir 在 Linux 下“报错”通常不是函数本身返回错误,而是用法或环境不对导致。下面按最常见原因帮你对照排查。
readdir 返回 NULL 不一定是错误struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
...
}
readdir 返回 NULL 有两种情况:
如何区分?
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常结束
}
}
opendir❌ 错误:
DIR *dir;
readdir(dir); // dir 未初始化
✅ 正确:
DIR *dir = opendir("/path");
if (!dir) {
perror("opendir");
return;
}
opendir 失败常见原因:
x)检查:
ls -ld /path
readdir 在多线程中不安全readdir 不是线程安全readdir_r(dir, entry, &result);
或readdir64_r
比如:
可能导致:
EBADF
ENOENT
closedir❌ 错误:
closedir(dir);
readdir(dir); // 已关闭
_FILE_OFFSET_BITS 问题老代码常见:
#define _FILE_OFFSET_BITS 64
否则大目录可能异常。
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *e;
while ((e = readdir(dir)) != NULL) {
printf("%s\n", e->d_name);
}
if (errno != 0)
perror("readdir");
closedir(dir);
return 0;
}
你可以直接贴:
perror 或 errno)我可以直接告诉你是哪一行、为什么错。