0

我可以这样使用readdir_r吗?我在规范中没有找到任何关于它的信息,但也许我只是瞎了......

readdir_r(dir, entry, &entry);
4

1 回答 1

3

它是 readdir_r ,第二个参数是指向struct dirent的指针,而不是 struct dirent 本身,第三个参数是指向 struct dirent 的指针,它接收 struct dirent 的地址或 NULL 表示 end-of -目录。用法类似于

struct dirent* pentry = malloc(offsetof(struct dirent, d_name) +
                             pathconf(dirpath, _PC_NAME_MAX) + 1);
if (!pentry)
    out_of_memory();

for (;;){
   struct dirent* result;
   readdir_r(dirp, pentry, &result); // you can check the return code, but it only fails if dirp is invalid
   if( !result )
       break;
   // process result
}
free(pentry);

正如 Hristo 上面指出的那样,参数是按值传递的,因此您可以将第二个 arg(pentry)的地址作为第三个 arg(即 &pentry)传递——它不会影响 readir_r,它无法判断。但是,当您到达目录末尾时,它将在 penentry 中存储 NULL,但是您需要 penentry 的值才能释放它指向的 malloced 缓冲区。所以忘记是否允许使用第二个参数的地址......这样做是没有意义的、误导的,并且会导致内存泄漏。

有关 readdir_r 的规范,请参阅 http://www.kernel.org/doc/man-pages/online/pages/man3/readdir.3.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions /readdir.html

于 2012-06-19T16:45:08.120 回答