readdir 在 CentOS 上报错,通常不是“系统问题”,而是用法或环境问题。下面分几种最常见原因说明,并给出对应的解决办法。
readdir 不是 shell 命令
如果你这样用:
$ readdir /tmp
✅ 一定会报错,因为 readdir 是 C 语言函数,不是 shell 命令。
ls /tmp
或
for f in /tmp/*; do echo "$f"; done
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
#include <dirent.h>
否则会报:
implicit declaration of function ‘readdir’
DIR *dir = opendir(path);
if (dir == NULL) {
perror("opendir");
}
常见错误:
✅ 排查:
ls -ld 目录
while ((entry = readdir(dir)) != NULL)
✅ 读到结尾返回 NULL 是正常的
❌ 错误写法:
entry = readdir(dir);
if (!entry) {
// 误以为是错误
}
SELinux 可能阻止程序访问目录。
查看:
getenforce
临时关闭测试:
sudo setenforce 0
CentOS 7 / 8 / Stream 都支持 readdir,但:
readdir_r(已废弃)✅ 推荐:
readdir()readdir_r()| 报错信息 | 原因 |
|---|---|
| command not found | 把 readdir 当命令用 |
| implicit declaration | 没 include <dirent.h> |
| opendir failed | 目录不存在 / 权限不够 |
| Segmentation fault | dir 为 NULL 就调用 readdir |
| Permission denied | SELinux 或权限问题 |
你可以直接贴出:
我可以 精确告诉你为什么会报错,并给出可运行示例 ✅