ИМЯ
readdir_r - чтение
содержимого
каталога
ОБЗОР
#include <dirent.h>
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
readdir_r():
_POSIX_C_SOURCE
|| /* версии glibc <= 2.19: */
_BSD_SOURCE || _SVID_SOURCE
ОПИСАНИЕ
Эта
функция
устарела;
вместо неё
используйте
readdir(3).
Функция
readdir_r()
является
реентерабельной
версией readdir(3).
Она читает
следующий
элемент
каталога
из потока
каталога dirp
и
возвращает
его в
выделенный
вызывающим
буфер, на
который
указывает
entry.
Описание
структуры
dirent
смотрите в
readdir(3).
Указатель
на
возвращаемый
буфер
помещается
в *result; если
достигнут
конец
потока
каталога,
то в *result
возвращается
NULL..
В
приложениях
рекомендуется
использовать
readdir(3) вместо
readdir_r(). Также,
начиная с
версии 2.24, в glibc
readdir_r()
считается
устаревшей.
Причины:
- В системах,
у которых
значение
NAME_MAX не
определено,
вызов readdir_r()
может быть
небезопасным,
так как
интерфейс
не
позволяет
вызывающему
задать
длину
буфера,
который
используется
для
возврата
элемента
каталога.
- В
некоторых
системах
readdir_r() не
может
прочитать
элементы
каталога с
очень
длинными
именами.
Когда
реализации
glibc
встречается
такое имя,
вызов readdir_r()
завершается
с ошибкой
ENAMETOOLONG только
после
чтения
последнего
элемента
каталога.
В других
системах
readdir_r() может
выполняться
без ошибок,
но
возвращаемое
поле d_name
может не
завершаться
null или может
быть
обрезанным.
- В текущей
спецификации
POSIX.1 (POSIX.1-2008), от readdir(3)
не
требуется
быть
нитебезопасной.
Однако в
современных
реализациях
(включая glibc)
параллельные
вызовы readdir(3)
для
различных
потоков
каталога
являются
нитебезопасными.
Поэтому
использовать
readdir_r() в
многонитевых
программах,
обычно, не
требуется.
В случаях,
когда
несколько
нитей
должны
читать
один поток
каталога,
всё равно
предпочтительней
использовать
readdir(3) с
внешней
синхронизацией,
а не readdir_r(), по
причинам,
описанным
выше.
- Ожидается,
что в
будущей
версии POSIX.1
функция
readdir_r() будет
помечена
как
устаревшая,
а для readdir(3)
будет
требоваться
нитебезопасность
при
одновременной
работе с
разными
потоками
каталога.
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ
При
успешном
выполнении
функция readdir_r()
возвращает
0. При ошибке
она
возвращает
положительный
номер
ошибки
(перечислены
в ОШИБКАХ).
Если
достигнут
конец
потока
каталога,
то readdir_r()
возвращает
0 и NULL в *result.
ОШИБКИ
- EBADF
- Неверный
дескриптор
потока
каталога
dirp.
- ENAMETOOLONG
- Обнаружено
слишком
длинное
имя
элемента
каталога
для
чтения.
АТРИБУТЫ
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
readdir_r() |
Безвредность
в нитях |
MT-Safe |
СООТВЕТСТВИЕ
СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.