readdir
是 Linux/Unix 系统中用于读取目录内容的函数。关于其多线程支持情况,以下是详细分析:
传统 readdir():
readdir_r() (已废弃):
现代替代方案:
readdir
在现代 glibc 中实际上是线程安全的readdir
内部使用线程本地存储(TLS)使用现代 readdir (glibc ≥ 2.24):
DIR *dirp = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dirp)) != NULL) {
// 处理目录项 - 注意: entry 内容在线程间共享
}
closedir(dirp);
使用 scandir():
struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);
// 处理结果数组
每个线程使用独立的 DIR 句柄:
void *thread_func(void *arg) {
DIR *dirp = opendir("/path");
// 使用 readdir(dirp)
closedir(dirp);
}
// 现代多线程安全示例
void process_directory(const char *path) {
DIR *dirp = opendir(path);
if (!dirp) {
perror("opendir");
return;
}
struct dirent *entry;
while ((entry = readdir(dirp)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
// 处理目录项
printf("%s\n", entry->d_name);
}
closedir(dirp);
}
总结:在现代 Linux 系统(glibc ≥ 2.24)中,readdir
可以安全地用于多线程环境,但每个线程应该使用独立的 DIR*
句柄。