在 Ubuntu(Linux)里,opendir() 是用来打开目录的系统/库函数(在 <dirent.h> 中)。
“权限”问题通常体现在 能否成功打开目录,以及 打开后能否读取内容 两方面。
下面分点说明如何处理权限。
opendir() 与权限的关系函数原型:
DIR *opendir(const char *name);
opendir() 返回 NULL,并设置 errno示例:
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
DIR *dir = opendir("/root");
if (!dir) {
perror("opendir");
}
如果当前用户不是 root,通常会看到:
opendir: Permission denied
Permission denied
原因:
o+x(其他用户执行权限)✅ 处理方法:
sudo 运行程序chmod o+x /some/dir
sudo chown youruser:youruser /some/dir
No such file or directory
处理:
if (errno == ENOENT) {
printf("目录不存在\n");
}
Not a directory
处理:
if (errno == ENOTDIR) {
printf("不是目录\n");
}
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
DIR *safe_opendir(const char *path) {
DIR *dir = opendir(path);
if (!dir) {
switch (errno) {
case EACCES:
fprintf(stderr, "权限不足: %s\n", path);
break;
case ENOENT:
fprintf(stderr, "目录不存在: %s\n", path);
break;
case ENOTDIR:
fprintf(stderr, "不是目录: %s\n", path);
break;
default:
perror("opendir");
}
}
return dir;
}
是的,但要求不同:
| 操作 | 所需权限 |
|---|---|
opendir() |
目录 x(执行) |
readdir() |
目录 r(读) |
| 进入子目录 | 子目录 x |
所以有时:
opendir() 成功readdir() 返回空或失败sudo ./your_program
sudo -u targetuser ./your_program
ls -ld /path/to/dir
namei -l /path/to/dir
如果你愿意,可以告诉我:
我可以帮你给出精确解决方案。