在 Linux 下 readdir()(或更常见的 opendir() + readdir())“卡住 / 阻塞”,通常不是函数本身有 bug,而是它正在等待某些系统资源或底层文件系统响应。下面按“最常见 → 较少见”的原因给你梳理。
这是 90% 的“readdir 卡住”原因。
hard 挂载(默认)表现:
opendir("/nfs/share"); // 可能卡
readdir(dir); // 可能卡很久
✅ 验证:
mount | grep nfs
mount | grep cifs
df -h # 是否卡住
✅ 解决:
soft,intr,timeo=10,retrans=2umount -l 懒卸载alarm() / 多线程)readdir() 本身不慢,但:
表现:
readdir() 很慢✅ 验证:
ls -1 | wc -l
✅ 解决:
✅ 检查:
iostat -x 1
dmesg | tail
如果进程状态是 D(不可中断睡眠):
ps -aux | grep your_proc
状态为 D+ → 等 IO,杀不掉。
✅ 原因:
✅ 解决:
dmesg如果你是:
readdir 会直接卡在用户态守护进程。
✅ 检查:
ps aux | grep fuse
错误示例:
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] == '.') continue;
}
看起来“卡住”,其实在扫大目录。
EINTR 没处理top
# 看 STAT 是否为 D
cat /proc/<pid>/stack
strace -p <pid>
如果卡在:
getdents64(...)
→ 文件系统问题
readdir 卡住 ≠ 函数问题,99% 是底层文件系统或 IO 阻塞
如果你愿意,可以把:
mount 输出ps / strace 结果发出来,我可以直接帮你定位是哪一种。