在 CentOS 上 readdir() 失败,通常不是系统问题,而是权限、路径、文件句柄或用法不对。下面按最常见原因 → 排查方法 → 示例来解释。
DIR *dir = opendir("/path/to/dir");
if (!dir) {
perror("opendir");
}
可能原因:
✅ 排查:
ls /path/to/dir
即使你有读权限,也要有 执行权限(x) 才能 readdir
ls -ld /path/to/dir
正确权限示例:
drwxr-xr-x
❌ 错误示例:
drw-r--r-- ← 没有 x,readdir 会失败
✅ 解决:
chmod +x /path/to/dir
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
⚠️ readdir 返回 NULL 不代表一定失败
errno✅ 正确写法:
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
如果你是:
readdir() 可能返回失败
✅ 排查:
df -h
mount | grep nfs
虽然少见,但可能:
✅ 查看限制:
ulimit -n
CentOS 默认开启 SELinux,可能阻止访问目录
✅ 检查:
getenforce
如果是 Enforcing,可临时测试:
setenforce 0
✅ 查看拒绝日志:
ausearch -m avc -ts recent
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
| 检查项 | 命令 |
|---|---|
| 目录是否存在 | ls /path |
| 是否有 x 权限 | ls -ld /path |
| errno 是什么 | perror("readdir") |
| 是否 NFS | mount |
| 是否 SELinux | getenforce |
你可以把:
opendir/readdir 代码perror 输出)发出来,我可以直接帮你定位到哪一行出错。