在 Ubuntu(Linux)下调用 readdir() 返回 Permission denied(EACCES),通常不是 readdir() 本身的问题,而是对目录没有访问权限或路径上的某个目录不可穿越。下面按常见原因逐一说明。
readdir() 需要对目录有执行(x)权限,才能进入并读取目录项。
例如:
ls -ld /some/dir
# drwxr----- 2 root root 4096 ...
如果当前用户不是 root,也没有权限:
DIR *d = opendir("/some/dir");
// opendir 可能成功,但 readdir 返回 NULL
// errno = EACCES
✅ 解决:
chmod o+x /some/dir
# 或
sudo chown youruser:youruser /some/dir
即使是目标目录有权限,路径中间的目录也必须可穿越。
例如:
/home/user/private/data/
如果:
drwx------ user user /home/user/private
那么:
opendir("/home/user/private/data");
会失败,因为无法“穿过” private
✅ 解决:
chmod +x /home/user/private
即使 ls 能看,程序仍可能被安全模块阻止。
检查:
sudo dmesg | grep denied
sudo aa-status
常见于:
✅ 解决(示例):
sudo aa-complain /path/to/binary
例如:
表现:
readdir -> EACCES
✅ 检查:
mount | grep dir
df -h
opendir("/etc/passwd"); // ❌
虽然 opendir 可能返回非 NULL,但 readdir 会失败。
✅ 正确:
opendir("/etc");
例如:
sudo 能读www-data 运行就失败✅ 检查运行用户:
ps aux | grep your_program
# 1. 看目录权限
ls -ld /path/to/dir
# 2. 看路径每一层
namei -l /path/to/dir
# 3. 看错误
perror("readdir");
Ubuntu 下 readdir 报 Permission denied,99% 是因为“对目录或其父目录缺少 x 权限”。
如果你愿意,可以把:
贴出来,我可以帮你精确定位。