在 Ubuntu 下调试 opendir(以及相关的 readdir、closedir 等目录操作),通常可以从代码、编译、运行时、系统调用几个层面入手。下面按实用顺序说明。
opendir 的基本用法:
#include <dirent.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "usage: %s <dir>\n", argv[0]);
return 1;
}
DIR *dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
常见错误:
closediropendir 失败一定设置 errno:
#include <errno.h>
DIR *dir = opendir(path);
if (!dir) {
fprintf(stderr, "opendir failed: %s\n", strerror(errno));
}
常见 errno:
ENOENT:目录不存在EACCES:权限不足ENOTDIR:不是目录gcc -g -Wall -Wextra opendir_test.c -o opendir_test
-g:生成调试符号-Wall -Wextra:发现潜在问题gdb ./opendir_test
在 gdb 中:
break main
run /some/dir
step
print dir
检查:
opendir 返回值是否为 NULLerrno 的值例如:
p dir
p errno
strace ./opendir_test /some/dir
你会看到类似:
openat(AT_FDCWD, "/some/dir", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
或失败:
openat(...) = -1 ENOENT (No such file or directory)
非常适合排查:
ls -ld /some/dir
ls -l /some/dir
如果是普通用户:
sudo ls -ld /some/dir
| 现象 | 原因 |
|---|---|
| opendir 返回 NULL | 路径错误或权限不足 |
| readdir 只返回 . 和 … | 目录为空或权限受限 |
| 程序崩溃 | 未检查 NULL 就使用 DIR* |
| 中文路径乱码 | 文件系统编码问题(UTF-8) |
你可以告诉我:
errno我可以直接帮你定位问题。