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函数为非线程安全函数;
解决方法: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
例子:
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;
}