在 Debian(或其他 Linux 发行版)下,opendir() 失败通常有以下几种常见原因。你可以结合 errno 和 perror() 来定位具体问题。
opendir() 基本说明#include <dirent.h>
DIR *opendir(const char *name);
DIR *NULL,并设置 errnoDIR *dir = opendir("/path/not/exist");
errno == ENOENT✅ 解决:
ls -ld /path/not/exist
opendir("/root");
errno == EACCES/root、/etc、/var 等目录权限严格✅ 解决:
ls -ld /root
sudo ./your_program
opendir("/etc/passwd");
errno == ENOTDIR✅ 解决:
file /etc/passwd
opendir("/very/long/path/...");
errno == ENAMETOOLONG✅ 解决:
realpath() 缩短路径例如:
opendir("/mnt/nfs");
errno == ENOENT 或 ENOTDIR✅ 解决:
mount | grep /mnt/nfs
Debian 默认使用 AppArmor,可能阻止程序访问某些目录。
✅ 检查:
sudo aa-status
✅ 日志:
sudo dmesg | grep apparmor
char *path = NULL;
opendir(path);
errno == EFAULT#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/some/path");
if (dir == NULL) {
perror("opendir failed");
return 1;
}
closedir(dir);
return 0;
}
运行后看错误信息:
./a.out
# opendir failed: Permission denied
errno 具体值是什么如果你愿意,可以把:
perror() 输出发出来,我可以直接帮你定位原因。