在 Linux 下调用 readdir()(或 readdir_r())时出现阻塞,通常不是函数本身的设计问题,而是底层文件系统的行为或系统状态导致的。下面是常见原因和解释:
readdir() 本身会阻塞吗?会,但只在必要时阻塞。
readdir() 是 同步系统调用封装,它内部会:
所以:
如果文件系统不能及时返回目录项,
readdir()就会阻塞等待
readdir() 阻塞的原因这是最常见原因。
例如:
opendir("/mnt/nfs/share");
readdir(dir); // 可能卡住几秒甚至几十秒
原因:
✅ 表现:
readdir() 卡在 D 状态(不可中断睡眠)strace 看到卡在 getdentsreaddir() 会:
例如:
ls huge_dir/ # 也会卡
✅ 特点:
可能出现:
此时:
readdir() 会一直等 IO 完成D 状态例如:
create / unlink某些文件系统(如 ext4)在并发下:
readdir() 可能需要等待锁例如 NFS 使用:
hard,intr
hard:IO 失败不会返回,一直重试readdir() 永久阻塞如果你用的是:
readdir() 是否阻塞完全取决于:
readdir() 是否真的阻塞?ps -eo pid,stat,comm | grep your_proc
D:不可中断睡眠(IO 阻塞)S:可中断睡眠strace -p <pid>
可能看到:
getdents64(...)
说明卡在目录读取。
mount | grep <path>
df -T <path>
readdir()D 状态无法被 kill)mount -o soft,timeo=10,retry=2
⚠️ 但可能丢数据,仅适合只读场景。
getdents64 + 自己解析(高级)
readdir()阻塞的本质是:目录数据不能及时从文件系统返回,而它又是同步调用。
如果你愿意,可以告诉我:
strace 或 ps 的输出我可以帮你更精确定位问题。