在 Ubuntu 下使用 opendir()(C/C++ 函数)时出现**“权限不足(Permission denied)”,通常是因为进程对目标目录没有读/执行权限**,或者目录本身有问题。下面按常见原因和处理方式说明。
opendir() 需要目录有:
查看权限:
ls -ld /path/to/dir
示例输出:
drwx------ 2 root root 4096 ...
→ 其他用户无法访问
sudo chmod 755 /path/to/dir
或仅给当前用户:
sudo chown $USER:$USER /path/to/dir
即使目标目录有权限,父目录也必须至少有 x 权限。
例如:
/home/user/private/data
如果 private 是 700,你就进不去 data
检查:
namei -l /path/to/dir
修复:
sudo chmod 755 /home/user
常见于 /var、/root、/mnt
解决:
sudo chown -R $USER:$USER /path/to/dir
⚠️ 不要随意改 /root、/etc 权限
例如:
查看运行用户:
ps aux | grep your_program
解决方式:
sudo 运行(不推荐长期使用)示例:
sudo groupadd shared
sudo usermod -aG shared $USER
sudo chown :shared /path/to/dir
sudo chmod 750 /path/to/dir
挂载参数可能限制了访问:
mount | grep /path
常见修复:
sudo mount -o remount,uid=1000,gid=1000 /mount/point
如果程序被限制:
sudo aa-status
临时测试:
sudo aa-complain /path/to/program
opendir 返回 NULL 也可能是:
检查:
file /path/to/dir
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
DIR *d = opendir("/path");
if (!d) {
fprintf(stderr, "opendir failed: %s\n", strerror(errno));
}
opendir 权限不足 = 当前用户对“目录及其所有父目录”没有 r+x 权限
如果你愿意,可以把:
ls -ld 输出发出来,我可以帮你精确定位。