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 中的其他函數。