在 Debian(或其他 Linux)系统上,调试 opendir() 出错通常分几个层次来做。下面从最常见原因 → 调试方法 → 示例一步步说明。
opendir() 为什么会失败opendir() 失败一定会设置 errno,常见原因有:
| 原因 | errno |
|---|---|
| 路径不存在 | ENOENT |
| 权限不足 | EACCES |
| 不是目录 | ENOTDIR |
| 打开文件数过多 | EMFILE / ENFILE |
| 路径过长 | ENAMETOOLONG |
perror() 打印错误#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/some/path");
if (dir == NULL) {
perror("opendir");
return 1;
}
closedir(dir);
return 0;
}
运行后你会看到类似:
opendir: No such file or directory
errno + strerror()#include <string.h>
#include <errno.h>
if (dir == NULL) {
fprintf(stderr, "opendir failed: %s (%d)\n",
strerror(errno), errno);
}
ls -ld /some/path
sudo lsopendir("./test");
⚠️ 注意:
getcwd() 调试char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("cwd: %s\n", cwd);
strace 看系统调用(非常推荐)strace ./your_program
你会看到类似:
openat(AT_FDCWD, "/some/path", O_RDONLY|O_DIRECTORY) = -1 ENOENT
这能直接证明是内核返回的错误。
gdb 调试gdb ./your_program
break main
run
step
print opendir("/some/path")
Debian 默认用 AppArmor:
sudo aa-status
如果是受限程序(如 nginx、snap):
/var/lib)opendir("/etc/passwd"); // 失败 ENOTDIR
char *path;
opendir(path); // UB
DIR *d = opendir(path);
if (!d) {
fprintf(stderr, "opendir(%s) failed: %s\n",
path, strerror(errno));
exit(EXIT_FAILURE);
}
如果你愿意,可以把:
发出来,我可以帮你精确定位问题。