简短结论:readdir(以及 readdir_r)本身通常是“非阻塞”的,但它可能会触发底层 I/O,从而在磁盘/网络文件系统层面发生阻塞。
下面分层次说明。
readdir 是什么在 Linux 中:
readdir() 用于读取目录流(DIR *)中的下一个目录项<dirent.h>DIR *dir = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
...
}
readdir 是否“阻塞”?readdir 不是异步/非阻塞 APIO_NONBLOCK 之类的语义所以严格说:
对调用线程而言,它是同步阻塞调用
Linux 的目录读取通常是缓冲式的:
opendir() 打开目录readdir() 从用户态缓冲中取值getdents64() 系统调用因此:
readdir 也可能较慢以下情况 readdir 可能长时间阻塞:
网络文件系统
目录损坏或 I/O 错误
FUSE 文件系统
大量文件
getdents 代价高readdir_r 的关系readdir_r 只是线程安全版本readdir 本身已是线程安全(内部加锁)Linux 没有原生的非阻塞 readdir,但可选方案:
pthread_create(..., read_dir_thread, ...);
opendir,再异步 I/O(复杂)io_uring + getdents64
readdir是同步 API,正常情况下很快,但在慢文件系统或异常情况下会阻塞线程;它不是“非阻塞 I/O”。
如果你有具体场景(比如 NFS、FUSE、海量小文件、高并发服务),我可以给更针对性的建议。