Debian 下 readdir() 失效通常不是系统本身的问题,而是使用方式、目录状态或权限导致的。下面按最常见原因 → 排查方法 → 示例来说明。
readdir() 用于读取目录内容,常见于:
opendir() + readdir()ls 内部也依赖目录读取DIR *dir = opendir(path);
if (dir == NULL) {
perror("opendir");
}
可能原因:
✅ 排查:
ls -ld /path
readdir() 返回 NULL 并不代表失败:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
NULL 可能是正常结束✅ 判断方式:
errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
perror("readdir");
}
即使你能 cd 进目录,也可能无法 readdir:
ls -ld /some/dir
✅ 测试:
sudo -u www-data ls /path
opendir() 后被删除✅ 现象:
readdir: No such file or directory
✅ 检查:
dmesg | tail
mount | grep path
在 Debian amd64 上:
readdir() 实际是 readdir64()✅ 建议:
#define _GNU_SOURCE
#include <dirent.h>
DIR* 被多个线程使用✅ 正确做法:
opendir()#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
errno = 0;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
opendir() 返回值是否为 NULLerrnor+x 权限DIR*你可以贴出:
我可以直接帮你定位是哪一条导致的 readdir 失效。