在 Ubuntu(Linux)下,opendir() 失败通常是由以下几类原因导致的。你可以结合 errno 来判断具体原因。
opendir() 返回 NULL 时最常见原因DIR *dir = opendir("/path/to/dir");
如果目录不存在,opendir() 会失败。
对应错误码
ENOENT:No such file or directory✅ 检查:
ls -ld /path/to/dir
当前用户没有 读取 + 执行(r-x) 目录的权限。
对应错误码
EACCES:Permission denied✅ 检查:
ls -ld /path/to/dir
id
✅ 解决:
chmod +rx /path/to/dir
# 或切换用户
opendir() 只能打开目录,不能打开普通文件。
对应错误码
ENOTDIR:Not a directory✅ 检查:
file /path/to/dir
opendir(NULL); // 未定义行为,通常失败
对应错误码
EFAULTopendir("/link/to/dir");
如果符号链接失效(断链):
对应错误码
ENOENT✅ 检查:
ls -l /link/to/dir
系统或进程打开的文件数达到上限。
对应错误码
EMFILE:进程打开文件过多ENFILE:系统打开文件过多✅ 查看限制:
ulimit -n
如果是挂载目录:
✅ 检查:
mount | grep path
df -h
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
DIR *dir = opendir(path);
if (dir == NULL) {
fprintf(stderr, "opendir failed: %s\n", strerror(errno));
}
| 现象 | 原因 |
|---|---|
| Permission denied | 目录无 x 权限 |
| No such file | 路径写错 |
| Not a directory | 路径是文件 |
| 程序在 root 下能跑,普通用户不行 | 权限问题 |
| Docker 里失败 | 挂载未加 -v |
你可以把:
errno / perror 输出发出来,我可以帮你精确判断是哪一条原因。