简短结论:readdir() 本身在“正常本地文件系统”下一般不会阻塞(除了极短时间的内部锁/互斥),但它并不是绝对非阻塞的,是否阻塞取决于底层文件系统、挂载方式和具体实现。
下面分情况说清楚。
readdir()(以及 readdir_r())通常不会长时间阻塞opendir() 可能触发少量 I/Oreaddir() 一般是内存操作✅ 一般不会阻塞
可能会阻塞,甚至可能阻塞很久
例如:
此时:
readdir() 可能卡在:
⚠️ 可能长时间阻塞(秒级到分钟级)
/proc//sys/如果:
那么 readdir() 会阻塞
readdir 和 getdents 的关系readdir() 是 libc 封装getdents64() 系统调用所以:
阻塞的不是
readdir()这个函数本身,而是底层 FS 的实现
readdir() 没有非阻塞版本openat() + O_NONBLOCK(对目录作用有限)// 在 worker 线程中调用 readdir
io_uring(Linux 5.1+)readdir/net、/mnt/*、FUSE 挂载点
readdir()在本地磁盘上基本不阻塞,但在网络/虚拟/异常文件系统中可能严重阻塞。
如果你愿意,我可以: