2012-06-19 2 views
0

Могу ли я использовать readdir_r вот так? Я не нашел ничего об этом в спецификации, но может быть, я просто слепой ...Для readdir_r, может ли запись и результат иметь одинаковое значение?

readdir_r(dir, entry, &entry); 
+0

'человек readdir_r' в вашей системе. – MYMNeo

+2

'readdir_t()' устанавливает свой аргумент 'result' в' NULL', когда достигнут конец каталога. Имейте это в виду, если вы выделите 'entry' на' malloc() '(возможная утечка памяти). В противном случае вы можете делать то, что вы делаете, так как «entry» и '& entry' передаются по значению функции. –

+0

@MYMNeo: В моей системе нет отдельной справочной информации, и в man 'readdir' нет ничего о моем вопросе. – thejh

ответ

3

Это readdir_ R, а второй аргумент является указателем на структуру Dirent, не сам struct struct, а третий аргумент - указатель на struct 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 (Пентри) в качестве третьего Arg (т.е. & Пентри) - - это не влияет на readir_r, который не имеет возможности сказать. Но это будет хранить NULL в пентри, когда вы достигнете конца каталога, но вам нужно значение pentry, чтобы освободить указанный malloced буфер. Поэтому забудьте о том, разрешено ли использование адреса второго аргумента ... делать это бессмысленно, вводить в заблуждение и приводит к утечке памяти.

Для спецификации из readdir_r см http://www.kernel.org/doc/man-pages/online/pages/man3/readdir.3.html или http://pubs.opengroup.org/onlinepubs/009695399/functions/readdir.html

+0

так что я не могу использовать 'readdir_r()' без использования 'malloc()' для dirent? или я могу просто передать указатель, указывающий мою 'dirent struct' в стеке? –

+0

@Jawsmerc Да, вы можете выделить 'struct dirent' в стеке. Элементу d_name будет достаточно места для пути длины NAME_MAX. –

Смежные вопросы