2016-01-09 2 views
0

readdir возвращает указатель на struct dirent, я тестировал, если два вызова readdir, хранящихся в двух разных указателях, изменяют содержимое первого указателя, это не так.C readdir & struct dirent allocation

Итак, я думаю, что readdir выделяет некоторую память, правда?

Если да, то он должен быть освобожден, то, что я никогда не делал раньше ...

+2

Что говорит страница человека? –

+0

'Данные, возвращаемые readdir(), могут быть перезаписаны последующими вызовами в readdir() для того же потока каталогов.', Как я уже сказал в сообщении, после двух вызовов он не изменил первую структуру. Это потому, что у него есть буфер записей, и после определенного количества вызовов он загружает остальную часть следующей части в буфере? –

+0

В нем говорится: «Может быть» *. В нем также говорится: «Не освобождайте». * Предполагаю, что вы сначала вызвали 'opendir', а затем после использования' closedir' в соответствии с ответами? –

ответ

0

Если он выделяется какой-либо памяти вызов closedir (http://linux.die.net/man/3/closedir) освободит его для вас

+0

Это означало бы, что вызовы 'readdir' заполняют динамический массив' struct dirent * ', это странно ... Это может быть огромно ... Мне бы хотелось знать, как работают потоки! Загружает ли он весь контент в буфер? Как я уже сказал ранее, это может быть огромным ... –

+0

Вам нужен только один для потока в каталоге. См. Цитату в другом сообщении –

0

Да, это должен быть выпущен. Вы должны позвонить closedir в каталог после readdir, так же, как вы звоните fclose после fopen для обычных файлов.

1

POSIX говорит, что приложение не должно изменять структуру, возвращаемую readdir():

Приложение не должно изменять структуру, в которой возвращение значения ReadDir() очки, ни какое-либо место хранения, на который указует указатели в структуре. Возвращаемый указатель и указатели в структуре могут быть недействительными или структура или области хранения могут быть перезаписаны последующим вызовом readdir() в том же потоке каталогов. На них не влияет вызов readdir() в другом потоке каталогов.

Таким образом, независимо от того, будет ли он выделять память внутри страны или использует статический буфер, зависит от способа реализации конкретной реализации. Все, что вам нужно сделать, это соблюдать контракт, который требует эта функция. То есть вы не должны пытаться изменить его и вызвать closedir(), чтобы закрыть поток каталога.

+0

Для проекта мне нужно реализовать эти функции в «Крошечной игрушечной файловой системе», поэтому мне нужны подробности о реализации! –

+0

@NicolasScottoDiPerto POSIX не требует, чтобы 'readdir()' был повторным или потокобезопасным. Таким образом, тривиальная реализация может использовать «статический» буфер и может быть совместима. –

+0

В последней строке цитаты POSIX сказано, что для каждого вызова 'opendir' нужен хотя бы один уникальный буфер, поэтому он не может быть системным« статическим »буфером. Это может быть «struct dirent», встроенный в структуру DIR (где структура DIR динамически распределяется с помощью opendir и освобождается 'closedir'). – user3386109

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