在 Debian(以及其它 Linux 系统)下,使用 readdir() 读取目录时,权限错误通常表现为 readdir() 返回 NULL,并且 errno 被设置为 EACCES(Permission denied)。下面从原理、处理方式和示例代码几个方面说明。
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
readdir() 不会单独因某个文件权限不足而失败opendir() 就可能失败opendir()stat() / lstat()DIR *dir = opendir("/root");
if (!dir) {
perror("opendir");
// errno == EACCES
}
错误码:
EACCES:权限不足ENOENT:目录不存在ENOTDIR:不是目录✅ 处理方式:检查 errno,避免程序崩溃
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常读到目录末尾
}
}
⚠️ 注意:
readdir() 读到结尾也返回 NULLerrno 清 0#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
void list_dir(const char *path) {
DIR *dir = opendir(path);
if (!dir) {
fprintf(stderr, "无法打开 %s: %s\n", path, strerror(errno));
return;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
}
if (access(path, R_OK) != 0) {
fprintf(stderr, "无权限: %s\n", path);
return;
}
errno 精确判断if (errno == EACCES) {
// 权限不足,跳过
}
/root、/proc 等sudo -u nobody your_program
fts / nftw更适合递归遍历,错误处理更清晰:
nftw(path, callback, 20, FTW_PHYS);
setuid| 场景 | 错误表现 | 处理方式 |
|---|---|---|
| 目录无读权限 | opendir 返回 NULL |
检查 errno == EACCES |
| 遍历中途失败 | readdir 返回 NULL 且 errno != 0 |
清 errno 后判断 |
| 子目录无权限 | stat/chdir 失败 |
跳过或提示 |
如果你有:
可以贴出来,我可以帮你针对性改。