readdir 在 Linux 下“卡住不动”通常不是函数本身的问题,而是底层文件系统或目录状态导致它阻塞了。下面按常见原因逐一说明,并给出排查思路。
如果目录在:
而服务端无响应,那么:
readdir()
会一直阻塞,表现为“卡住”。
✅ 排查:
mount | grep <目录>
或
df -h <目录>
✅ 验证是否网络问题:
ls <目录> # 同样会卡
readdir 本身是流式的,但:
opendir + 第一次 readdir需要读取大量 inode,可能看起来卡住几秒到几分钟。
✅ 特征:
✅ 排查:
ls -l | wc -l
例如:
readdir 会阻塞在 VFS 层。
✅ 检查:
mount
dmesg | tail
例如误用:
opendir("/dev")
readdir(...)
某些设备节点会导致阻塞(罕见但存在)。
✅ 建议:
/proc、/sys、/dev 随意 readdirreaddir 在等内核 IO,进程处于:
D (uninterruptible sleep)
✅ 查看:
ps -eo pid,stat,cmd | grep your_proc
✅ 特征:
kill -9 也杀不掉while ((ent = readdir(dir)) != NULL)
如果 readdir 返回 NULL 且 errno 被设置,你可能误以为是“卡住”。
✅ 正确写法:
errno = 0;
while ((ent = readdir(dir)) != NULL) {
...
}
if (errno != 0) {
perror("readdir");
}
rm -rf可能导致 readdir 反复重试。
stracestrace -p <pid>
你会看到类似:
readdir(3,
一直不动 → 内核层阻塞
cat /proc/<pid>/stackcat /proc/<pid>/stack
能看到内核调用栈(需要 root)。
readdir卡住,99% 不是 readdir 的锅,而是它背后的文件系统“动不了”。
如果你愿意,可以补充:
strace 输出我可以更精确地帮你定位。