在 Debian(以及所有 Linux) 里,大家常说的 readdir 其实涉及 好几个不同层面,容易混淆。下面按 “是什么 / 用在哪 / 区别” 给你系统梳理一下。
readdir 是 读取目录内容 的接口,但存在 三种常见含义:
| 名称 | 属于 | 用途 |
|---|---|---|
readdir() |
POSIX C 函数 | 程序里遍历目录 |
getdents() |
Linux 系统调用 | 内核真正干活的 |
readdir 命令 |
不存在 | 很多人误以为有这个命令 |
readdir() —— C 标准库函数(最常用)头文件
#include <dirent.h>
函数原型
struct dirent *readdir(DIR *dirp);
特点
getdents() 系统调用struct dirent示例
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
注意
. 和 .. 也会被读出来getdents() / getdents64() —— 真正的系统调用特点
readdir() 底层调用它区别
| readdir | getdents |
|---|---|
| 用户态 | 内核态 |
| 可移植 | Linux 专用 |
| 简单 | 复杂 |
| 推荐 | 不推荐 |
❌ 不存在
如果你看到类似:
readdir /tmp
那通常是:
ls 当成 readdir✅ 正确命令是:
ls
或
find
| 文件系统 | readdir 行为 |
|---|---|
| ext4 | 顺序不保证 |
| xfs | 顺序不保证 |
| tmpfs | 顺序不保证 |
| btrfs | 顺序不保证 |
⚠️ 不要依赖 readdir 返回顺序
readdir64Debian 64 位系统中:
readdir() == readdir64()
但在 32 位系统或老代码中:
readdir() 可能不支持大 inodereaddir64() 是扩展版本| ❌ 误区 | ✅ 正确 |
|---|---|
| readdir 是命令 | 它是 C 函数 |
| readdir 返回完整路径 | 只返回文件名 |
| readdir 顺序固定 | 顺序未定义 |
| readdir = 系统调用 | 实际是库函数 |
Debian 下 readdir 通常指
readdir()这个 C 库函数,它用来遍历目录,底层调用getdents()系统调用,没有对应的 shell 命令。
如果你是想问:
可以直接告诉我,我可以针对你具体场景讲。