readdir 是 POSIX 标准 中用于读取目录内容的函数,在 Debian(以及所有 Linux 发行版) 中属于 glibc 提供的接口。它本身没有“Debian 特有参数”,参数和语义与标准 UNIX/Linux 一致。
下面按常见使用场景说明。
readdir(POSIX,最常用)#include <dirent.h>
struct dirent *readdir(DIR *dirp);
| 参数 | 说明 |
|---|---|
dirp |
由 opendir() 返回的目录流指针 |
struct dirent 的指针NULLNULL,并设置 errno#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;
}
struct dirent 结构(关键字段)struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移(不推荐直接使用)
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型(部分文件系统支持)
char d_name[256]; // 文件名
};
d_type 常见取值| 值 | 含义 |
|---|---|
DT_REG |
普通文件 |
DT_DIR |
目录 |
DT_LNK |
符号链接 |
DT_BLK |
块设备 |
DT_CHR |
字符设备 |
DT_FIFO |
管道 |
DT_SOCK |
socket |
⚠️ 注意:某些文件系统(如 ext4 支持,NFS 可能不支持)d_type 可能为 DT_UNKNOWN。
readdir_r(已废弃)Debian / glibc 中不推荐使用:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
✅ 原因:
readdir() + 锁,或 readdir_r() 的替代方案getdents(Linux 特有,底层系统调用)#include <sys/syscall.h>
#include <unistd.h>
int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
readdir() 内部就是调用 getdents()dpkg -L libc6 | grep readdir
头文件位置:
/usr/include/dirent.h
❌ 错误理解:
readdir 有 flags 参数(没有)✅ 正确做法:
qsortd_name| 接口 | 推荐度 | 说明 |
|---|---|---|
readdir() |
✅✅✅ | 标准、安全、推荐 |
readdir_r() |
❌ | 已废弃 |
getdents() |
⚠️ | 底层系统调用 |
如果你是想问:
可以直接告诉我你的具体场景,我可以针对性说明。