在 Debian(或其他 Linux 系统)下,opendir() 返回 NULL(空) 通常是因为目录打开失败。这是很常见的问题,不代表函数“没实现”,而是有具体原因。
下面按最常见 → 较少见的顺序说明原因和排查方法。
DIR *dir = opendir("/path/to/dir");
if (!dir) {
perror("opendir");
}
如果路径不存在,opendir 一定返回 NULL。
✅ 检查:
ls -ld /path/to/dir
opendir("/etc/passwd"); // 错误
✅ 检查:
file /path/to/dir
即使你能 ls,C 程序也可能没权限(比如用 root 创建、普通用户运行)。
错误示例:
opendir: Permission denied
✅ 检查:
ls -ld /path/to/dir
✅ 解决:
chmod +rx /path/to/dir
opendir("logs"); // 取决于当前工作目录
✅ 检查当前目录:
#include <unistd.h>
char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("cwd=%s\n", cwd);
以下通常没问题:
opendir("/tmp/")
opendir("/tmp")
但 符号链接断开 会失败:
ls -l /path/to/dir
某些服务(如 nginx、systemd 服务)受限制。
✅ 查看:
dmesg | grep apparmor
opendir("/mnt/usb")
但 USB 没挂载。
✅ 检查:
mount | grep /mnt/usb
dmesg | grep "read-only"
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/var/log");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir))) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
如果你愿意,可以把:
perror() 输出的错误信息发出来,我可以直接帮你定位是哪一条原因。