在 CentOS 上调用 readdir 报错,通常不是 CentOS 本身的问题,而是用法或环境导致的。下面按最常见原因给你排查清单。
#include <dirent.h>
#include <stdio.h>
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
readdir 本身没报错,是目录打不开
常见错误:
检查:
ls -ld /your/path
C 程序里:
if ((dir = opendir(path)) == NULL) {
perror("opendir");
}
SELinux 问题(CentOS 特有):
getenforce
如果是 Enforcing,可以临时测试:
setenforce 0
#include <dirent.h>
少了这个会报:
implicit declaration of function ‘readdir’
readdir(dir)->d_name // ❌ 如果返回 NULL 会段错误
✅ 正确:
struct dirent *e = readdir(dir);
if (e) { ... }
closedir(dir);
readdir(dir); // ❌ 未定义行为
CentOS 上如果编译老代码:
#define _FILE_OFFSET_BITS 64
否则 readdir / struct dirent 可能不匹配
readdir 不是线程安全readdir_r(旧)或 readdir + 加锁gcc test.c -o test
不需要额外库,readdir 在 libc 中
在程序里加:
#include <errno.h>
#include <string.h>
printf("errno=%d: %s\n", errno, strerror(errno));
或者:
perror("readdir");
你可以把:
贴出来,我可以直接告诉你具体是哪一行、为什么报错。