標籤:style blog color os io strong 資料 for
readdir, readdir_r - 讀一個目錄
readdir函數:
struct dirent *readdir(DIR *dirp);
The data returned by readdir() may be overwritten by subsequent calls to readdir() for the same directory stream.
成功時,readdir() 返回指向 dirent 結構的指標。(這個結構是靜態分配的;不要試圖去free(3) 它。)如果到達了上當結尾,NULL 被返回並保持ERRNO不變。如果錯誤發生了,NULL 被返回並小心設定 ERRNO值。
readdir函數為非安全執行緒函數;
解決方案:
1、加鎖;
2、用局部變數儲存資料。
readdir_r()就是採用局部變數儲存資料;
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
The readdir_r() function returns 0 on success. On error, it returns apositive error number (listed under ERRORS). If the end of the directory stream is reached, readdir_r() returns 0, and returns NULL in*result.
readdir_r() 函數是 readdir() 函數可重新進入版本。它從目錄流dirp 裡讀取下一個目錄項,並且通過調用者分配的緩衝區 entry返回。返回條目的指標被放置於 *result 裡;如果目錄流到達結尾,那麼把*result 設定為 NULL。
#include <iostream>#include <dirent.h>using namespace std;int main(){ struct dirent *pStResult = NULL; struct dirent *pStEntry = NULL; int len = 0; DIR *pDir = opendir("/home/wzy/owner_lib"); if(NULL == pDir) { printf("Opendir failed!\n"); return 0; } len = offsetof(struct dirent, d_name) + pathconf("/home/wzy/owner_lib", _PC_NAME_MAX) + 1; pStEntry = (struct dirent*)malloc(len); while(! readdir_r(pDir, pStEntry, &pStResult) && pStResult != NULL) { printf("file‘name is %s\n", pStEntry->d_name); } free(pStEntry); closedir(pDir); return 0;}