在 CentOS(其实是 Linux 通用的 readdir 行为)里,readdir 返回 NULL 并不一定代表“目录为空”,需要结合 errno 来判断。下面是常见原因和排查方法。
readdir 返回 NULL 的两种含义struct dirent *readdir(DIR *dirp);
✅ 很多人误以为返回 NULL 就是“目录为空”,这是错误的。
opendir 成功DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
}
如果 opendir 失败,readdir 直接返回 NULL。
常见原因:
ls -la /path
如果目录下只有 . 和 ..,readdir 会返回:
...即使你能 cd 进去,也可能看不到内容:
ls -ld /path
# drwxr-x--- root root
在 C 中:
errno = 0;
while ((entry = readdir(dir)) != NULL) {
...
}
if (errno != 0)
perror("readdir");
CentOS 默认开启 SELinux:
getenforce
# Enforcing
可能现象:
opendir 成功readdir 返回 NULLerrno == EACCES排查:
ausearch -m avc -ts recent
临时测试:
setenforce 0
opendir("/path/link");
如果 link 指向文件或无效路径,会导致异常。
✅ 正确做法:
stat("/path", &st);
if (!S_ISDIR(st.st_mode)) {
// 不是目录
}
closedirCentOS 上常见:
mount | grep path
df -h
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
DIR *dir = opendir("/path");
if (!dir) {
perror("opendir");
return;
}
errno = 0;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
opendir 是否成功?errno 是否为 0?如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一条原因。