@cnicutar FTR, приведенный пример невозможен - «Возвращенный указатель ... не должен зависеть от вызова readdir () в другом потоке каталогов». Фактическое возвращаемое значение должно быть сохранено в каждом DIR, а не глобально.

me -a

Linux crowsnest 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

$ man readdir:

ОПИСАНИЕ

Функция readdir () возвращает указатель на структуру dirent, представляющую следующую запись каталога в потоке каталога, на который указывает dirp ...

.. [надрез] ...

Функция readdir_r () является реентерабельной версией readdir () ...

... [надрез] ...

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха readdir () возвращает указатель на структуру dirent. (Эта структура может быть статически распределена; не пытайтесь освободить ее (3).) Если достигнут конец потока каталога, возвращается NULL и значение errno не изменяется. Если возникает ошибка, возвращается значение NULL и значение errno устанавливается соответствующим образом.

Функция readdir_r () возвращает 0 в случае успеха. В случае ошибки возвращается положительный номер ошибки. Если достигнут конец потока каталога, readdir_r () возвращает 0 и возвращает NULL в * результате.

Я запутался в том, что это означает, что я применяю эту функцию для сбора динамически размещенного массива указателей на структуры с данными о записях каталога, и мне интересно, могу ли я динамически размещать структуры directnt и устанавливать для них указатели , но эта строка говорит о том, что результат никогда не должен вызываться free, поэтому мне интересно, должен ли я выделить отдельную структуру dirent, которая будет частью списка, и memcpy над возвращаемым результатом.

Меня также смущает терминология "май" на странице руководства выше. Означает ли это, что иногда он статически распределен, а иногда нет.

Я знаком (смутно) с тем, что означают статические переменные в C, но не уверен насчет всех правил и возможных ошибок вокруг них. поскольку я хочу передать директивные структуры, находящиеся в каталоге, я бы предпочел, чтобы он был динамически размещен. это то, что readdir_r для? или двойной указатель будет установлен, чтобы указывать на другую статически распределенную структуру dirent?

и я не совсем уверен, что означает реентерабельность в этом контексте для readdir_r. я понимаю ренетрант только из сопрограмм схемы, которые я не уверен, как это применимо к чтению каталогов Unix.

Ответы на вопрос(3)

Ваш ответ на вопрос