在 Debian(以及所有 Linux 系统)里,readdir 通常有两种常见含义,我分开说明,你可以看看你问的是哪一种。
readdir()(最常见)readdir() 用于读取目录内容,定义在:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp);
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
struct dirent 常用字段struct dirent {
ino_t d_ino; // inode 号
off_t d_off;
unsigned short d_reclen;
unsigned char d_type; // 文件类型(DT_REG、DT_DIR 等)
char d_name[256]; // 文件名
};
✅ 注意
readdir() 返回 . 和 ..readdir_r(),但已不推荐)if (entry->d_type == DT_REG) {
printf("普通文件: %s\n", entry->d_name);
} else if (entry->d_type == DT_DIR) {
printf("目录: %s\n", entry->d_name);
}
⚠️ 有些文件系统(如某些 NFS)d_type 可能是 DT_UNKNOWN,这时要用 lstat()。
从系统调用角度看:
readdir() 不是系统调用getdents() / getdents64()
关系:
opendir()
↓
open()
↓
getdents64() ← 内核真正读取目录
↓
readdir() ← glibc 封装
你可以在 Debian 下查看:
man 2 getdents
man 3 readdir
在 shell 中没有 readdir 命令,一般用:
ls
或
for f in *; do
echo "$f"
done
如果你是在某个脚本中看到 readdir,可能是:
ls -ld dir不一定:
NULL 可能是到达目录结尾errno 会被设置if (readdir(dir) == NULL) {
if (errno != 0) {
perror("readdir");
}
}
你可以具体说明:
我可以针对你具体场景继续讲。