在 Debian(以及其它 Linux 发行版)里,opendir() 返回“权限不足”(EACCES)通常不是函数本身的问题,而是进程对目标目录没有访问权限导致的。下面按常见原因逐一说明。
opendir() 权限不足的常见原因Linux 打开目录需要 执行权限(x):
ls -ld /some/dir
# drwxr-x--- root root
→ opendir() 会失败,errno = EACCES
✅ 解决:
chmod o+x /some/dir
# 或
chown youruser /some/dir
即使目标目录权限正确,父目录也必须有 x 权限:
/home/user/secret/logs
如果 secret 是:
drwx------ user user
那其他用户连 logs 都进不去。
✅ 检查:
namei -l /path/to/dir
例如:
opendir("/root");
默认 /root 权限是 700
✅ 解决:
sudo/root如果你是:
很可能用户根本没有权限。
✅ 检查运行用户:
ps aux | grep yourprog
Debian 默认启用 AppArmor,可能限制程序访问目录。
sudo aa-status
✅ 查看是否被限制:
dmesg | grep denied
例如:
noexecnosuid虽然通常不影响 opendir(),但某些网络文件系统(NFS、CIFS)会因:
root_squash导致失败。
/symlink -> /real/path
你有权限访问 symlink,但没权限访问真实目录。
perror 看错误#include <stdio.h>
#include <errno.h>
#include <dirent.h>
DIR *d = opendir("/path");
if (!d) {
perror("opendir");
}
ls /path
如果 shell 也进不去,那不是 C 程序问题。
strace 看系统调用strace ./your_program
你会看到:
openat(AT_FDCWD, "/path", O_RDONLY|O_DIRECTORY) = -1 EACCES
DIR *dir = opendir(path);
if (!dir) {
if (errno == EACCES)
fprintf(stderr, "权限不足: %s\n", path);
}
opendir()报权限不足,99% 是因为“当前用户”对“目录或其任意一级父目录”没有x权限。
如果你愿意,可以把:
ls -ld 输出发出来,我可以帮你精确判断是哪一种。