在 Debian(以及所有 Linux/Unix 系统)里,readdir() 是一个用于读取目录内容的系统调用 / 库函数(定义在 <dirent.h>)。
它本身不直接返回错误码,而是通过 返回值 + errno 来表示错误。
struct dirent *readdir(DIR *dirp);
struct dirent 的指针NULL,errno 不变NULL,errno 被设置⚠️ 注意:
返回 NULL 不一定代表出错,必须配合 errno 判断。
| errno | 含义 | 常见原因 |
|---|---|---|
EBADF |
无效的文件描述符 | DIR 指针已关闭或损坏 |
ENOENT |
目录不存在 | 目录在读取过程中被删除 |
EACCES |
权限不足 | 对目录没有读权限 |
ENOMEM |
内存不足 | 系统无法分配内存 |
EIO |
I/O 错误 | 磁盘、文件系统损坏 |
EOVERFLOW |
值溢出 | 文件过大(某些 32 位系统) |
EINTR |
被信号中断 | 读取时被信号打断 |
readdir(dir);
// errno = ENOENT
ls /root
# Permission denied
对应 EACCES
closedir(dir);
readdir(dir); // EBADF
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常结束
}
}
| 函数 | 说明 |
|---|---|
opendir() |
打开目录 |
readdir() |
读取一个目录项 |
closedir() |
关闭目录 |
readdir_r() |
线程安全版本(已不推荐) |
你可以直接告诉我:
2, 13, 5)errno 名称(如 EACCES)我可以帮你精准分析 ✅