在 CentOS(以及一般 Linux) 上,readdir()(及其现代可重入版本 readdir_r())本身通常是不会“阻塞”的,但有一些细节需要注意:
readdir() 是否会阻塞?readdir() 是从 已打开的目录流(DIR *) 中读取缓存好的目录项所以:
DIR *dir = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 通常不会阻塞
}
opendir() 可能阻塞(不是 readdir)opendir() 需要打开目录opendir(),而不是 readdir()readdir() 也可能阻塞以下情况较少见,但可能发生:
readdir vs getdentsreaddir() 是 glibc 封装getdents() / getdents64()getdents() 才是真正和内核交互的接口getdents() 阻塞,readdir() 也会卡住opendir() + alarm() / pthreadopen() + getdents() + O_NONBLOCK(有限)soft, timeo, retransmount -o soft,timeo=10,retrans=3
在 CentOS 上,
readdir()本身通常不会阻塞,阻塞一般发生在opendir()或文件系统底层 I/O(尤其是网络文件系统或大目录)。
如果你愿意,可以告诉我:
我可以更具体地分析。