在 Ubuntu(Linux)下,readdir 相关错误通常通过 errno 来判断。下面系统地给你讲一下怎么“看” readdir 的错误码。
readdir 原型#include <dirent.h>
struct dirent *readdir(DIR *dirp);
⚠️ 注意:
readdir 返回 NULL 不一定是错误
#include <errno.h>
#include <dirent.h>
#include <stdio.h>
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
// 这里才是真正的错误
} else {
// 正常遍历结束
}
}
✅ 关键点:
调用 readdir 前先 errno = 0
| errno | 含义 | 常见原因 |
|---|---|---|
EBADF |
无效的文件描述符 | DIR 指针已被 closedir |
ENOENT |
目录不存在 | 目录被删除 |
EACCES |
权限不足 | 无读权限 |
ENOMEM |
内存不足 | 系统内存紧张 |
EIO |
I/O 错误 | 磁盘/文件系统故障 |
EOVERFLOW |
文件太大 | 32/64 位不兼容 |
perror("readdir");
输出示例:
readdir: Permission denied
#include <string.h>
#include <errno.h>
printf("errno = %d: %s\n", errno, strerror(errno));
readdir:非线程安全readdir_r:线程安全(已逐渐废弃)readdir64:大文件系统(>2GB)错误码含义基本一致。
strace -e trace=readdir,getdents ./your_program
ls -ld /path
closedir(dir);
readdir(dir); // ❌ EBADF
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while (1) {
errno = 0;
entry = readdir(dir);
if (!entry) {
if (errno) {
perror("readdir");
break;
} else {
printf("end of directory\n");
break;
}
}
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
如果你愿意,可以:
我可以帮你精确分析是哪一类问题。