在 Debian(以及大多数 Linux 发行版)中,readdir 通常用于 读取目录内容。下面从 系统调用 / glibc 函数 和 常见用法示例 两方面说明。
readdir 是什么?readdir 是 POSIX 标准定义的目录读取函数,定义在:
#include <dirent.h>
✅ 用于逐个读取目录中的文件和子目录
✅ 常见于 C / C++ 程序
✅ Debian、Ubuntu、CentOS 等系统通用
#include <stdio.h>
#include <dirent.h>
int main(void) {
DIR *dir;
struct dirent *entry;
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
gcc readdir_example.c -o readdir_example
./readdir_example
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 | 符号链接 |
⚠️ 注意:d_type 在某些文件系统(如 FAT、NFS)上可能不可用。
Debian 上 Python 没有直接使用 readdir,但等价操作:
import os
for name in os.listdir("."):
print(name)
ls
底层实际上也使用了 readdir / getdents。
. 和 .. 为什么会出现?readdir 会返回目录中的 所有项,包括:
. 当前目录
.. 上级目录
if (entry->d_name[0] != '.') {
printf("%s\n", entry->d_name);
}
在 Debian 上,readdir 实际由以下系统调用实现:
getdents()
getdents64()
可用 strace 查看:
strace ls
如果你是想问:
可以直接告诉我具体场景,我可以更详细地帮你分析。