在 CentOS(Linux) 里,readdir() 能不能成功,本质上取决于目录的权限和调用进程的身份。下面从原理、常见权限问题、排查与解决几个方面说明。
readdir() 是读取已经打开的目录流(由 opendir() 返回)。
能否 opendir() 成功,关键看:
对目录来说,三种权限含义不同:
| 权限 | 对目录的含义 |
|---|---|
| r | 可列目录内容(ls、readdir) |
| w | 可增删文件 |
| x | 可进入目录(cd、访问子项) |
✅ readdir 至少需要:
DIR *dir = opendir("/root");
/root 默认权限:drwx------✅ 解决:
chmod 755 /root
drwxr-xr-- 目录
❌ readdir 失败
即使权限正确,也可能失败。
查看:
getenforce
临时排查:
setenforce 0
如确实 SELinux 限制:
ls -Z /path
restorecon -Rv /path
ls -ld /path
示例:
drwxr-xr-x 2 user user 4096 ...
含义:
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir))) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ 确保:
r-xx示例修复:
chmod 755 /data
chown appuser:appuser /data
如果你有:
我可以帮你精准分析。