在 Debian(或其他 Linux)系统上测试 readdir 功能,通常可以从系统调用层面、glibc API 层面、以及实际应用层面来做。下面按常用、实用程度给你几种方法。
ls 间接测试 readdirls 本身就依赖 readdir,是最直观的验证方式。
mkdir testdir
touch testdir/{a,b,c}.txt
ls testdir
✅ 如果能正常列出文件,说明 readdir 基本可用。
readdir()(glibc API)// test_readdir.c
#include <stdio.h>
#include <dirent.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;
}
编译并运行:
gcc test_readdir.c -o test_readdir
./test_readdir
✅ 能看到 . 和 .. 及其他文件,说明 readdir() 正常工作。
readdir_r()(线程安全版本,已不推荐)readdir_r(dir, &entry, &result);
⚠️ 在最新 glibc 中 readdir_r 已被标记为 deprecated,但仍然可以使用。
readdir() 实际上是 getdents / getdents64 的封装。
strace 观察strace ls testdir
你会看到类似:
getdents(3, /* 10 entries */, 32768) = 200
✅ 说明内核 readdir 流程正常。
opendir("/not_exist");
预期:
opendir: No such file or directory
mkdir private
chmod 000 private
./test_readdir private
预期:
opendir: Permission denied
mkdir bigdir
for i in $(seq 1 10000); do touch bigdir/file_$i; done
./test_readdir bigdir
✅ 可验证 readdir 是否能正确处理大量目录项。
ls bigdir | wc -l
./test_readdir bigdir | wc -l
数字应一致。
ext4 再测ldd --version
d_off 在 32 位系统上可能溢出✅ 最推荐方式:
ls → 快速验证readdir() → 精确测试strace ls → 看系统调用如果你是想:
可以告诉我具体场景,我可以给你针对性更强的测试方案。