在 CentOS(或其它 Linux 系统)里,readdir() 返回“空”通常不是函数本身的问题,而是使用方式或环境导致的。下面按最常见原因逐一说明。
readdir() 的正确行为容易让人误解readdir() 是迭代函数readdir() 每次只返回一个目录项,直到返回 NULL 才表示结束。
❌ 错误理解:
struct dirent *de = readdir(dir);
// 只读到第一个文件
✅ 正确写法:
struct dirent *de;
while ((de = readdir(dir)) != NULL) {
printf("%s\n", de->d_name);
}
如果只调用一次,看起来就像“返回空”。
opendir() 失败但没检查DIR *dir = opendir("/some/path");
readdir(dir); // dir 可能是 NULL
✅ 必须检查:
if (!dir) {
perror("opendir");
return;
}
常见失败原因:
Permission denied)ls -ld /path
如果是:
drwx------ root root
非 root 用户 readdir() 会失败。
即使权限对,也可能读不到:
查看:
getenforce
如果是 Enforcing,可以看日志:
ausearch -m avc -ts recent
临时验证:
setenforce 0
readdir() 会返回:
...如果你看到只有这两个,那目录“逻辑上为空”。
mount | grep /path
如果 /path 是空的挂载点,readdir() 可能返回空或失败。
os.listdir()scandir()ioutil.ReadDir()这些在失败时可能:
# 1. 路径存在?
ls -ld /path
# 2. 权限够?
id
ls /path
# 3. SELinux?
getenforce
ausearch -m avc
# 4. C 程序检查?
opendir 返回值
errno
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *de;
while ((de = readdir(dir)))
printf("%s\n", de->d_name);
closedir(dir);
return 0;
}
如果你愿意,可以贴:
我可以直接帮你定位是哪一种原因。