C++ readdir、readdir_r函數


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;
}     

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM