在 Debian / Linux 下,“捕获 readdir 错误”通常指两件事之一:
1)用 C/C++ 调用 readdir() 时如何判断并处理错误
2)在 shell 脚本或命令行中如何检测 ls/find 等操作失败
下面分别说明。
readdir() 错误readdir() 本身不设置 errno 来指示“没有更多文件”,只有在发生错误时才设置 errno。
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/some/dir");
if (!dir) {
perror("opendir");
return 1;
}
errno = 0; // 先清零
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
// readdir 出错
perror("readdir");
}
closedir(dir);
return 0;
}
| 情况 | 说明 |
|---|---|
EBADF |
DIR* 无效 |
ENOENT |
目录在遍历过程中被删除 |
EIO |
底层 I/O 错误(磁盘、网络文件系统) |
ENOMEM |
内存不足 |
while ((entry = readdir(dir)) == NULL) {
// ❌ 错误:这不能区分“结束”和“错误”
}
正确方式:
readdir() == NULL 不表示错误errnols、find 等命令本质上是调用 readdir()。
ls 错误ls /some/dir 2>ls.err
if [ $? -ne 0 ]; then
echo "readdir 或目录访问失败"
fi
find /some/dir 2>&1 | grep -i "permission denied\|no such file"
如果你想真正看到 readdir 系统调用是否失败:
strace ls /some/dir 2>&1 | grep readdir
或者更常见的是:
strace -e trace=open,readdir,getdents ls /some/dir
✅ 检查目录是否存在、权限是否正常:
ls -ld /some/dir
✅ 检查是否是 NFS / FUSE 等文件系统问题:
df -T /some/dir
✅ 检查 dmesg(I/O 错误):
dmesg | tail
✅ C 程序中:
readdir() 返回 NULL 不等于出错errno✅ Shell 中:
$?stderr如果你愿意,可以告诉我:
我可以给你更精确的答案。