2012-06-19 44 views
0

可以使用这样的readdir_r吗?我没有找到关于它的规范什么,但也许我只是盲目...对于readdir_r,可能条目和结果具有相同的值?

​​
+0

'男人readdir_r'。 – MYMNeo

+2

当到达目录结尾时,'readdir_t()'将其'result'参数设置为'NULL'。如果你用'malloc()'(可能的内存泄漏)分配'entry',请牢记这一点。否则,你可以做你所做的事情,因为'entry'和'&entry'是按值传递给函数的。 –

+0

@MYMNeo:在我的系统上没有关于它的单独手册页,在'readdir'手册中没有提到我的问题。 – thejh

回答

3

这是readdir_ [R,第二个参数是指针一个struct的dirent,而不是一个结构dirent本身,第三个参数是一个指向结构dirent的指针,它接收struct dirent的地址或NULL作为结束目录。用法是一样的东西

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

至于斯托伊奇上面所指出的,参数是按值传递的,所以你可以通过第二ARG(pentry)作为第三个参数的地址(即& pentry) - - 它不影响readir_r,它无法分辨。但是,当你到达目录结尾时,它会在pentry中存储NULL,但是你需要pentry的值来释放它指向的malloced缓冲区。因此,忘记是否允许使用第二个参数的地址......这样做是毫无意义的,误导性的,并导致内存泄漏。

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

+0

所以我不能使用'readdir_r()'而不使用'malloc()'来执行dirent?或者我可以只传递一个指向我的'dirent结构'在堆栈上的指针? –

+0

@Jawsmerc是的,你可以在栈上分配一个'struct dirent'。 d_name成员将有足够的空间存放长度为NAME_MAX的路径。 –

相关问题