在 Debian 里说到 readdir,通常指两类东西,差异来源不太一样:
1. 系统调用 / glibc 接口层面
Debian 使用的 readdir 主要来自 glibc,不是内核自己实现:
readdir()(旧接口,返回 struct dirent *)
readdir_r()(线程安全版本,已不推荐)
readdir64() / readdir64_r()(大文件系统 / 64 位 inode)
getdents() / getdents64()(底层系统调用)
差异大吗?
- 接口行为:基本稳定,跨 Debian 版本(如 stretch / buster / bullseye / bookworm)差异很小
- 底层实现:glibc 内部可能优化,但对外语义基本不变
- 线程安全:现代 Debian 中
readdir() 本身已是线程安全(内部加锁),readdir_r() 已被标记为 deprecated
2. 文件系统 / 内核行为差异
这部分可能有明显差异:
- 不同内核版本对
getdents64 支持略有不同
- 某些文件系统(overlayfs、ceph、nfs)在 readdir 时的:
- 返回顺序
- inode 稳定性
- 是否支持
d_type
- Debian 老版本 + 老内核可能在
d_type 上不完整
3. 实际开发中的“坑”
常见差异点:
d_type == DT_UNKNOWN 在某些文件系统下很常见
- 不能依赖 readdir 的返回顺序
- 大目录下 readdir 性能差异可能明显(内核 / 文件系统有关)
- 32 位系统用
readdir vs readdir64 要注意 inode 溢出
总结
- Debian 各版本间 readdir API 本身差异不大
- 真正差异来自内核版本 + 文件系统实现
- 如果是普通本地 ext4 / xfs,基本不用关心版本差异
- 如果是网络存储 / 容器 / 老系统,需要测试行为
如果你是指:
- 某个具体 Debian 版本(如 10 vs 12)
- 某种文件系统
- C / Python / shell 中的 readdir
我可以给你更针对性的说明。