在 Debian(以及一般的 Linux/UNIX 系统)里,opendir 是在 C 标准库(glibc) 中实现的,而不是内核里。下面按“你在哪能看到它被调用/定义”来说明。
opendir 本身在哪里定义#include <dirent.h>
DIR *opendir(const char *name);
在 glibc 源码里,opendir 通常在:
sysdeps/posix/opendir.c
或者在架构/系统相关的目录中(比如 Linux 特有实现):
sysdeps/unix/sysv/linux/opendir.c
实际流程一般是:
opendir()
└── open() // 打开目录文件
└── fdopendir() // 基于 fd 初始化 DIR 结构
opendir 不是系统调用,它内部会调用:
open() / openat()(系统调用)getdents64()(读取目录项)可以用 strace 看到:
strace ls /tmp
你会看到类似:
openat(AT_FDCWD, "/tmp", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
getdents64(3, ...)
你自己的代码通常这样调用:
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
man 3 opendir
apt source glibc
然后在源码里搜索:
grep -R "opendir" sysdeps/
opendir是在 glibc 中调用的,内部通过open/openat+getdents64与 Linux 内核交互;它不是系统调用本身。
如果你是想:
可以告诉我你的具体目的,我可以直接给你对应示例或路径。