在 Ubuntu(以及其它 Linux 发行版)里,readdir() 失败或“没权限”通常不是函数本身的问题,而是文件系统权限模型导致的。下面按常见原因系统说明。
readdir() 只是读取一个已经打开的目录流,真正决定能不能“看到目录内容”的是:
对目录本身要有执行(x)权限,且通常需要读(r)权限
drwxr-x--- user group dir/
r:可以列目录(readdir 能看到文件名)x:可以进入目录(opendir 成功)x → opendir() 直接失败r → readdir() 可能返回空或失败$ ls -ld /some/dir
drw-r--r-- user user /some/dir
r 但没 xopendir() 成功readdir() 失败或返回 NULLerrno = EACCES✅ 解决:
chmod +x /some/dir
即使目标目录权限正常:
/srv/data/logs
如果:
drwxr--r-- root root /srv
你仍然无法 opendir("/srv/data/logs")
✅ 解决:
chmod +x /srv
drwx------ user user dir/
其他用户:
opendir() → Permission deniedreaddir() → 根本拿不到目录流常见情况:
例如:
/home/user/data (NFS, root_squash)
✅ 检查:
mount | grep dir
ls -ld dir
Ubuntu 默认启用 AppArmor,例如:
即使 ls 能看到,程序调用 readdir() 仍可能被拦。
✅ 检查:
sudo dmesg | grep apparmor
sudo aa-status
原因可能是:
ls 用 sudo# 1. 看目录权限
ls -ld /path/to/dir
# 2. 看父目录
namei -l /path/to/dir
# 3. 看当前用户
id
# 4. 测试 opendir + readdir
strace -e trace=openat,getdents your_program
| errno | 含义 |
|---|---|
| EACCES | 权限不足 |
| ENOENT | 目录不存在 |
| ENOTDIR | 不是目录 |
| EPERM | 被安全模块拦截 |
Ubuntu 下 readdir 权限问题,99% 是“目录或其父目录缺少 x 权限”,或受 AppArmor / 用户身份限制。
如果你愿意,可以贴出:
ls -ld我可以帮你精确判断是哪一类问题。