简短回答:readdir 在 Debian(以及大多数 Linux 系统)上不是系统调用,而是一个 C 库函数。
下面分层次说明一下,避免混淆:
readdir 是什么?readdir 是 POSIX 标准定义的用户态接口,用于读取目录内容。
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
它来自 glibc,不是 Linux 内核提供的系统调用。
在 Linux 中,真正的内核系统调用是:
getdentsgetdents64readdir 内部通常会调用 getdents64(取决于 glibc 实现)。
你可以用 strace 验证:
strace ls
你会看到类似:
getdents64(...)
而不是 readdir。
readdir 不是系统调用?原因有几个:
readdir 需要维护状态(如目录流 DIR *),而系统调用是“无状态”的opendir)getdentsstruct dirent没有。
无论是 Debian、Ubuntu、CentOS 还是 Arch:
readdir 始终是 glibc 提供的库函数getdents / getdents64✅ readdir = 用户态函数
✅ getdents / getdents64 = 系统调用
如果你愿意,我也可以:
readdir vs readdir_r vs getdents 的用法和安全性