在 Debian(以及大多数 Linux 系统)中,readdir 相关异常通常出现在 用 C/C++ 调用目录遍历时,或者 shell / 脚本层面出现异常。下面按常见场景给你一个排查与处理思路。
readdir 异常readdir 是 POSIX 标准函数,用于读取目录内容,常见异常包括:
DIR *dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return -1;
}
✅ 检查点:
path 是否存在ls -ld /path/to/dir
❌ 错误写法:
while ((entry = readdir(dir)) != NULL) {
...
}
// 没检查 errno
✅ 正确写法:
errno = 0;
while ((entry = readdir(dir)) != NULL) {
...
}
if (errno != 0) {
perror("readdir");
}
readdir返回 NULL 时可能是正常结束,也可能是错误
readdir_r 已废弃✅ 建议:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
...
}
如果目录在遍历过程中被 删除 / 重命名 / 挂载变化,可能导致:
ENOENTEBADF✅ 解决思路:
opendirDebian 默认使用 UTF-8,但老程序可能:
strlen 处理文件名✅ 检查:
locale
✅ 确保程序支持 UTF-8
✅ 不要假设文件名长度 = 字符数
症状:
readdir 变慢✅ 优化建议:
fts 或 nftw如果你并不是写 C 程序,而是 Debian 下 ls / find 出问题:
ls: reading directory '.': Permission denied
✅ 解决:
sudo ls -l /path
或
chmod +r /path
#include <errno.h>
#include <string.h>
perror("readdir");
strace ./your_program
或:
strace ls /path
重点看:
getdentsopenread#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir(".");
if (!dir) return 1;
errno = 0;
struct dirent *ent;
while ((ent = readdir(dir)) != NULL) {
printf("%s\n", ent->d_name);
}
if (errno) perror("readdir");
closedir(dir);
return 0;
}
overlayfs 读目录异常dpkg 安装中断导致目录损坏✅ 检查:
mount | grep path
fsck
你可以补充以下信息之一:
我可以直接给你 针对性修复代码或命令。