在 Ubuntu(Linux)下 readdir 读取失败,通常不是“系统 bug”,而是参数、权限、目录状态或使用方式出了问题。下面按最常见原因 → 排查方法 → 示例来说明。
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
readdir 返回 NULL 不代表一定失败
errno 不变errno 被设置✅ 必须先检查 opendir 是否成功
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
}
可能错误:
/ 或少写✅ 检查:
ls -ld /some/path
Permission denied
即使你是普通用户:
x 权限r 权限✅ 检查:
ls -ld /path
✅ 解决:
chmod +rx /path
opendir 成功此时:
readdir(dir); // 可能返回 NULL,errno = ENOENT
常见错误:
DIR *dir = NULL;
readdir(dir); // 未检查 opendir 返回值
或:
closedir(dir);
readdir(dir); // 已关闭
✅ 正确写法:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
错误示例:
Input/output error
Stale file handle
✅ 检查:
mount | grep path
df -h
readdir 可能返回错误一般不会致命,但可能:
errno = 0;
struct dirent *entry = readdir(dir);
if (!entry) {
if (errno != 0) {
perror("readdir failed");
} else {
printf("end of directory\n");
}
}
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
if (argc < 2) return 1;
DIR *dir = opendir(argv[1]);
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;
}
strace ./your_program /path
可以看到:
openatgetdents你可以直接贴:
我可以精确告诉你 是哪一种失败原因。