在 CentOS(以及其他 Linux 系统)上,readdir() 返回“空”通常不是函数本身的问题,而是使用方式或环境导致的。下面按常见原因逐一说明。
readdir() 本身的行为要先搞清楚readdir() 不会返回“空字符串”,而是:
struct dirent *NULLNULL,并设置 errno所以很多人说的“返回空”,其实是:
readdir()返回了NULL
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
如果:
opendir() 直接返回 NULL,后续 readdir() 永远为空。
✅ 检查:
ls -ld /some/path
CentOS 中很多“看起来有内容”的目录其实是:
例如:
ls -l /mnt
如果 /mnt 是挂载点但没挂载,readdir() 就是空的。
错误示例:
struct dirent *entry = readdir(dir);
// 只读了一次
正确方式:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
隐藏文件(
.和..)也会返回,别误以为“空”
即使你是 root,也可能遇到:
namei -l /path/to/dir
修复示例:
chmod +x /path/to/dir
老 C 程序在 CentOS 7+ 可能遇到:
readdir vs readdir64建议:
#define _GNU_SOURCE
#include <dirent.h>
并使用 readdir64()
closedir(dir);
// 另一个线程还在 readdir
结果是未定义行为,可能表现为“空”。
在 Docker / Kubernetes 中:
用:
cat /proc/mounts
确认是否挂载。
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
struct dirent *de;
while ((de = readdir(dir))) {
printf("-> %s\n", de->d_name);
}
closedir(dir);
命令行验证:
ls -la /path
stat /path
getenforce
你可以贴出:
cat /etc/redhat-release)我可以直接帮你定位是哪一条原因。