readdir 返回空,不一定是“读目录出错”,而是调用方式、目录状态或排错不全面导致的。下面按 Debian / Linux 常见原因给你一个系统排查清单。
常见原因前 3 位:
readdir 实际是 读到结尾(EOF),而不是失败opendir 成功但 readdir 返回 NULL,你没区分 EOF 还是错误readdir 返回空 ≠ 出错在 Linux(包括 Debian)中:
#include <dirent.h>
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
...
}
NULL| 情况 | 判断方式 |
|---|---|
| 读到目录结尾 | errno 不变 |
| 发生错误 | errno 被设置 |
✅ 正确写法:
errno = 0;
entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir error");
} else {
// 正常 EOF
}
}
如果你只看返回值,很容易误以为“返回空 = 出错”。
ls -a /path
⚠️ 即使是空目录,也至少应有:
.
..
如果你看到只有这两个,那 readdir 其实是正常工作的。
例如:
opendir("/etc/passwd"); // ❌ 普通文件
✅ 检查:
#include <sys/stat.h>
struct stat st;
stat(path, &st);
if (!S_ISDIR(st.st_mode)) {
// 不是目录
}
即使你是普通用户:
/root/proc/PIDopendir 可能失败:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
}
或者 readdir 中途返回 NULL。
✅ 测试:
ls -ld /path
opendir("./data");
但程序运行时的 cwd 并不是你以为的目录。
✅ 检查:
pwd
ls data
或改用绝对路径测试。
在 Debian 上:
/proc/sys/dev有些目录 目录项动态生成,可能出现:
readdir 返回空✅ 不要假设这些目录“一定可读”。
目录在 opendir 后:
rm -rfreaddir 可能返回空或失败。
#include <stdio.h>
#include <dirent.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;
}
ls -a /你的目录
ls -ld /你的目录
stat /你的目录
opendir 是否返回 NULL?
errno 是否变化?
路径是否是目录?
是否有 . 和 ..?
你可以直接贴出:
errno 或 perror 输出cat /etc/debian_version)我可以帮你精确判断是 程序 bug 还是 系统行为。