readdir
和 readdir_r
都是用于读取目录内容的函数,但它们之间存在一些关键区别:
readdir
不是线程安全的。readdir
可能会导致数据竞争和不一致的结果。struct dirent
的指针,该结构体包含了目录项的信息。NULL
。DIR *dir = opendir("/path/to/directory");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
readdir
使用全局变量来跟踪当前读取的位置,这可能导致在多线程环境中出现问题。readdir_r
是线程安全的版本。DIR *dir = opendir("/path/to/directory");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent buffer;
struct dirent *entry;
while ((entry = readdir_r(dir, &buffer, &entry)) == 0) {
printf("%s\n", entry->d_name);
}
if (entry != NULL) {
perror("readdir_r");
}
closedir(dir);
readdir_r
使用局部变量来跟踪当前读取的位置,因此在多线程环境中更加安全。readdir
。readdir_r
。需要注意的是,现代的 POSIX 标准已经推荐使用 readdir_r
的替代方案,如 readdir
的线程安全版本(在某些系统上可能不可用),或者使用更高级别的抽象,如 dirent.h
中的其他函数。