在 CentOS(以及一般 Linux 系统)上,readdir()(以及相关的 readdir_r()、getdents() 等)是否阻塞,主要取决于底层文件系统类型和当时的 I/O 状态。下面分情况说明。
readdir 通常不阻塞对于本地普通文件系统(如 ext4、xfs):
opendir() 打开目录readdir() 从内核缓存或磁盘读取目录项只要目录内容已经在页缓存中,readdir 几乎立刻返回。
readdir 会“阻塞”的常见场景第一次读取一个大目录或刚启动的系统:
readdir 会阻塞,直到磁盘 I/O 完成✅ 这是最常见的“阻塞”原因
✅ 跟 CentOS 版本无关,是 Linux VFS 行为
NFS-mounted 目录
readdir 实际是 RPC 调用➡️ readdir 会长时间阻塞
常见表现:
ls 卡住find 挂起D 状态(不可中断睡眠)getdents表现:
readdir 返回慢➡️ readdir 可能永久阻塞(进程进入 D 状态)
如果是:
readdir 是否阻塞完全取决于实现
readdir 是否阻塞ps -eo pid,stat,comm | grep your_proc
S:可中断睡眠(正常)D:不可中断睡眠(通常卡在 I/O)cat /proc/<pid>/stack
strace -p <pid>
常见阻塞点:
getdents64(...)
readdir 本质是 getdents64 系统调用CentOS 上
readdir在“目录数据需要从磁盘或网络获取时”才会阻塞,本地缓存命中时不会。
如果你有具体场景(比如 NFS、ls 卡死、Docker 卷、某目录特别慢),可以贴出来,我可以帮你精确定位原因。