Могу ли я использовать readdir_r
вот так? Я не нашел ничего об этом в спецификации, но может быть, я просто слепой ...Для readdir_r, может ли запись и результат иметь одинаковое значение?
readdir_r(dir, entry, &entry);
Могу ли я использовать readdir_r
вот так? Я не нашел ничего об этом в спецификации, но может быть, я просто слепой ...Для readdir_r, может ли запись и результат иметь одинаковое значение?
readdir_r(dir, entry, &entry);
Это 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
так что я не могу использовать 'readdir_r()' без использования 'malloc()' для dirent? или я могу просто передать указатель, указывающий мою 'dirent struct' в стеке? –
@Jawsmerc Да, вы можете выделить 'struct dirent' в стеке. Элементу d_name будет достаточно места для пути длины NAME_MAX. –
'человек readdir_r' в вашей системе. – MYMNeo
'readdir_t()' устанавливает свой аргумент 'result' в' NULL', когда достигнут конец каталога. Имейте это в виду, если вы выделите 'entry' на' malloc() '(возможная утечка памяти). В противном случае вы можете делать то, что вы делаете, так как «entry» и '& entry' передаются по значению функции. –
@MYMNeo: В моей системе нет отдельной справочной информации, и в man 'readdir' нет ничего о моем вопросе. – thejh