在 CentOS 下调用 readdir() 返回“权限不足”(通常是 errno == EACCES),并不是 readdir() 本身的问题,而是目录或路径的访问权限不足。下面按常见原因逐一说明。
readdir() 只能读取已经成功 open 的目录流(DIR *)。
要成功 opendir() + readdir(),必须满足:
否则:
opendir() 失败 → errno = EACCESreaddir() 返回 NULL,errno = EACCESls -ld /some/dir
如果看到:
drwx------ root root /some/dir
那么:
readdir() 会报权限不足✅ 解决:
chmod 755 /some/dir
即使目标目录权限正常,父目录也要有 x 权限。
例如:
/srv/data/logs
如果 /srv/data 是:
drwxr--r-- root root
缺少 x,则无法访问 logs
✅ 解决:
chmod 755 /srv /srv/data
CentOS 默认开启 SELinux,即使 ls -l 显示权限正常,也可能被拦截。
查看是否有 SELinux 拒绝:
sudo ausearch -m avc -ts recent
或临时验证:
setenforce 0
如果关闭后正常 → 就是 SELinux 策略问题
✅ 解决方式:
例如:
即使你是 root 登录,程序可能不是 root
查看运行用户:
ps -ef | grep your_program
✅ 解决:
如果是:
可能出现:
✅ 检查:
mount | grep dir
dir -> /protected/secret
即使 dir 权限正常,真实目录无权限也不行
# 1. 看目录权限
ls -ld /path
# 2. 看父目录
namei -l /path
# 3. 看 SELinux
getenforce
ausearch -m avc
# 4. 看程序用户
ps -ef | grep app
DIR *d = opendir("/data");
if (!d) {
perror("opendir");
}
输出:
opendir: Permission denied
→ 100% 是 目录访问权限问题
如果你愿意,可以贴:
ls -ld 输出我可以帮你精准定位。