在 Debian(以及一般 Linux)系统上,readdir() 读取目录失败通常不是函数本身的问题,而是权限、路径、文件描述符状态或并发问题导致的。下面按常见原因逐一说明,并给出排查方法。
opendir() 的路径不存在示例错误:
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
}
排查:
ls -ld /some/path
即使目录存在,也可能没有读权限(r)或执行权限(x)。
ls -ld /some/path
# 示例
drwx------ 2 root root 4096 ...
程序以普通用户运行就会失败
解决:
sudo 运行chmod +rx /some/path
readdir() 返回 NULL 有两种情况:
errno 会被设置正确写法:
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常结束
}
}
umount)此时 readdir() 可能返回 ENOENT 或 EBADF
closedir(dir);
readdir(dir); // 未定义行为
在 Debian 上常见:
现象:
opendir 成功readdir 报错:EIO, ESTALE排查:
mount | grep path
dmesg | tail
| errno | 含义 |
|---|---|
| EACCES | 权限不足 |
| ENOENT | 目录不存在 |
| ENOTDIR | 不是目录 |
| EBADF | DIR 已关闭 |
| EMFILE / ENFILE | 文件描述符耗尽 |
| EIO | I/O 错误(磁盘/网络) |
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/var/log");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
你可以贴出:
perror / errno 输出cat /etc/debian_version)我可以直接帮你定位是哪一类问题。