在 Linux 里,readdir 是 POSIX 目录读取函数,用来遍历一个打开的目录。下面从“函数怎么用、返回什么、怎么判断结束、示例代码”几个方面说清楚。
readdir 函数原型#include <dirent.h>
struct dirent *readdir(DIR *dirp);
dirp:由 opendir() 返回的目录流指针struct dirent 的指针(静态分配,下一次调用会被覆盖)NULLNULL,并设置 errno⚠️ 注意:
readdir 返回 NULL 时,可能是:
errno 区分(见示例)struct dirent 结构(常用字段)struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[]; // 文件名
};
常用:
d_name:文件名(字符串)d_type:文件类型(可选,有些文件系统不支持)#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
readdir 是“结束”还是“出错”while ((entry = readdir(dir)) != NULL) {
// 正常读取
}
if (errno != 0) {
// 出错
} else {
// 正常结束
}
readdir 不是线程安全readdir_r(已废弃但旧系统仍有)readdir + 加锁readdir + TLSPOSIX 推荐直接使用 readdir(现代 glibc 已内部加锁)。
不要保存 dirent 指针
// 错误
struct dirent *p = readdir(dir);
// 下次调用后 p 内容会变
. 和 .. 也会返回
目录打开后一定要 closedir
| 函数 | 作用 |
|---|---|
opendir |
打开目录 |
readdir |
读取一项 |
closedir |
关闭目录 |
rewinddir |
重新读取 |
seekdir / telldir |
定位 |
如果你问的是 “readdir 在内核 / syscall 层怎么返回”(如 getdents),或者 “C++ / Python 的 readdir”,可以继续问。