在 CentOS(其实是 Linux 通用行为,和 CentOS 版本无关)里,readdir 的行为如下:
readdir 是什么readdir 是 POSIX / glibc 提供的目录读取函数,原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
用于读取目录流中的下一个目录项。
readdir 的返回值struct dirent 的指针struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};
⚠️ 注意:
readdir 会覆盖该内容freeNULLerrno 不会被设置NULLerrno 被设置(如 EBADF)✅ 判断方式:
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常结束
}
}
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
| 误区 | 正确说明 |
|---|---|
readdir 返回文件名字符串 |
❌ 返回 struct dirent * |
NULL 一定是错误 |
❌ 也可能是目录结束 |
需要 free 返回值 |
❌ 不能 free |
readdir 是 线程不安全 的readdir_r(已不推荐)或 readdir + 锁如果你是想问:
readdir 在 系统调用层(getdents)可以继续问,我可以按具体场景说明。