在 Debian(或其他 Linux)上测试 readdir(目录读取)通常分几种情况,取决于你是测试系统调用、测试应用程序行为,还是排查 readdir 相关问题。下面按常见场景给你一套实用方法。
readdir 是 glibc 提供的函数,用于读取目录内容,底层通常调用:
getdents() / getdents64()(系统调用)相关头文件:
#include <dirent.h>
如果只是想“看 readdir 能不能读到目录内容”:
ls -l 目录名
或:
find 目录名 -maxdepth 1
✅ 如果这些都正常,说明 readdir 基本没问题。
#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("用法: %s 目录\n", argv[0]);
return 1;
}
DIR *dir = opendir(argv[1]);
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
gcc readdir_test.c -o readdir_test
./readdir_test /tmp
如果输出目录内容,说明 readdir 工作正常。
./readdir_test .
你应该能看到:
.
..
✅ 说明 readdir 会返回 . 和 ..
strace ./readdir_test /tmp
你会看到类似:
openat(...)
getdents64(...)
✅ 如果 getdents64 返回正常,说明内核层面没问题。
./readdir_test /not_exist
预期:
opendir: No such file or directory
mkdir /tmp/testdir
chmod 000 /tmp/testdir
./readdir_test /tmp/testdir
预期:
opendir: Permission denied
⚠️ readdir 返回顺序是不确定的(依赖文件系统)
测试:
./readdir_test /tmp | sort
✅ 如果你需要稳定顺序,必须自己排序。
你可以补充以下信息,我可以更精确帮你分析:
cat /etc/debian_version
df -T
| 问题 | 原因 |
|---|---|
| readdir 返回 NULL | 目录结束 / 出错 |
| 少文件 | 权限 / overlay / bind mount |
| 顺序不一致 | 文件系统特性 |
| 中文乱码 | locale 问题 |
如果你愿意,可以把你的 具体测试目标或报错信息贴出来,我可以一步一步帮你定位。