在 CentOS(或其他 Linux 系统)中,readdir 返回为空,一般有下面几种常见原因。我们可以按“从简单到底层”的顺序排查。
先用命令行确认:
ls -la /path/to/dir
如果确实是空的,readdir 返回空是正常的。
很多 readdir 为空其实是 路径错误。
示例错误:
opendir("logs"); // 程序运行目录不是你以为的目录
✅ 解决:
getcwd() 确认当前目录常见错误写法:
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) { ... }
✅ 正确写法:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
如果 opendir 返回 NULL,readdir 自然一直为空。
在 Linux 中:
如果目录没有 x 权限:
ls: cannot open directory: Permission denied
C 程序中:
opendir 可能成功readdir 返回 NULL✅ 检查:
ls -ld /path/to/dir
✅ 修复:
chmod +x /path/to/dir
CentOS 默认开启 SELinux,可能导致:
✅ 检查:
getenforce
ausearch -m avc -ts recent
✅ 临时测试:
setenforce 0
如果这样能读到了,说明是 SELinux 策略问题。
例如:
mount | grep /path
df -h /path
如果挂载失败,readdir 看到的是空挂载点。
DIR* 被多个线程共用closedir 后还调用 readdirif (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
如果目录里只有这两个,readdir 逻辑上确实“没有有效文件”。
请确认:
opendir 返回值不为 NULLr+x 权限. 和 ..你可以贴出:
ls -ld 目录errno 或 perror 输出我可以直接指出是哪一条原因。