在 Debian(或其他 Linux)系统里,opendir() 失败通常意味着目录打不开。可以从下面几个方面排查和解决。
opendir() 返回 NULL 时,一定要看 errno,这是最关键的一步。
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
// 或
printf("errno=%d: %s\n", errno, strerror(errno));
}
常见 errno 含义:
| errno | 含义 |
|---|---|
| ENOENT | 目录不存在 |
| EACCES | 权限不足 |
| ENOTDIR | 不是目录(是个文件) |
| EMFILE / ENFILE | 打开文件数过多 |
| ELOOP | 符号链接循环 |
ls -ld /your/path
解决:
ls -ld /your/path
如果是:
drwx------ root root
解决:
sudo 运行(仅调试)chmod +rx /your/path
chroot / 容器中路径不对opendir("/etc/passwd"); // 错误
解决:
stat() 判断:struct stat st;
stat(path, &st);
S_ISDIR(st.st_mode);
常见于服务器程序。
检查:
ulimit -n
lsof -p <pid>
解决:
DIR *:closedir(dir);
ulimit -n 65535
如果是:
可能:
检查:
mount | grep your_path
df -h
strace -e trace=openat,stat,getdents ./your_program
可以直接看到:
#include <dirent.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) return 1;
DIR *d = opendir(argv[1]);
if (!d) {
perror("opendir");
return 1;
}
closedir(d);
return 0;
}
gcc test.c -o test
./test /some/dir
如果你愿意,可以把:
perror 的输出发出来,我可以帮你精准定位问题。