zoukankan      html  css  js  c++  java
  • 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!
    ");
          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
    ", pStEntry->d_name);
      }
    
    
      free(pStEntry);
      closedir(pDir);
      return 0;
    }     
    

      

  • 相关阅读:
    svn git 共存
    如何写软件设计文档
    spring boot requestbody string to date
    asp.net core 1.1 publish to a linux
    asp.net core 1.1 entityframework mysql
    [FPGA]記錄一些不錯的網站推薦給大家參考。
    [FPGA][DE0] Qsys 加入 FLASH 記憶體 方法及步驟
    [FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)
    [Nios][UART] 使用UART 的一些問題?
    [Nios][Eclipse] find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
  • 原文地址:https://www.cnblogs.com/delmory/p/3910967.html
Copyright © 2011-2022 走看看