Struct dirent linux �

Struct dirent linux �

struct dirent *readdir(DIR *dirp);
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE

ОПИСАНИЕ

В Linux структура dirent определена следующим образом:

В соответствие с POSIX.1, структура dirent обязательно должна содержать поле d_name[] неопределённой длины с максимальным количеством символов NAME_MAX, предшествующих конечному байту null (‘\0’), и d_ino (расширение XSI). Другие поля не стандартизованы и имеются не во всех системах; подробней смотрите ЗАМЕЧАНИЯ далее.

Данные, возвращаемые readdir(), могут быть переписаны последующими вызовами readdir() для того же потока каталога.

Функция readdir_r() является реентерабельной версией readdir(). Она читает следующую запись каталога из потока каталога dirp и возвращает её в созданном вызывающим буфере, на который указывает entry (информацию о выделении буфера смотрите далее в ЗАМЕЧАНИЯХ). Указатель на возвращаемый элемент помещается в *result; если достигнут конец потока каталога, то возвращается NULL вместо значения *result.

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

При успешном выполнении функция readdir_r() возвращает 0. При ошибке она возвращает положительный номер ошибки (перечислены в ОШИБКАХ). Если достигнут конец потока каталога, то readdir_r() возвращает 0 и NULL в *result.

ОШИБКИ

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
readdir() безвредность в нитях небезопасно (MT-Unsafe race:dirstream)
readdir_r() безвредность в нитях безвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

Значение, возвращаемое в d_off, тоже самое что и после вызова telldir(3) в текущем положении курсора в потоке каталога. Учтите, что не смотря на тип и имя, в современных файловых системах поле d_off мало похоже на смещение в каталоге. Приложения должны считать, что это поле неизвестного типа и не делать предположений о его содержимом; смотрите также telldir(3).

Кроме Linux, поле d_type доступно, в основном, только в системах BSD. Это поле позволяет избежать затрат на вызов lstat(2), если дальнейшие действия зависят от типа файла. Если определён макрос тестирования свойств _BSD_SOURCE, то в glibc определены следующие макросы-константы значений, возвращаемых в d_type:

DT_BLK блочное устройство DT_CHR символьное устройство DT_DIR каталог DT_FIFO именованный канал (FIFO) DT_LNK символическая ссылка DT_REG обычный файл DT_SOCK доменный сокет UNIX DT_UNKNOWN неизвестный тип

Если тип файла не определён, то d_type присваивается значение DT_UNKNOWN.

В настоящее время, только файловые системы (среди которых: Btrfs, ext2, ext3 и ext4) поддерживают возврат типа файла в d_type. Все приложения должны правильно обрабатывать возвращаемое значение DT_UNKNOWN.

Так как в POSIX.1 не определён размер поля d_name и других нестандартных полей, которые могут находиться перед этим полем в структуре dirent, переносимые приложения, использующие readdir_r(), должны выделять буфер, адрес которого передаётся в entry, следующим образом:

(в POSIX.1 требуется, чтобы d_name было последним полем в struct dirent)

Источник

Struct dirent linux �

The internal format of directories is unspecified.

The header shall define the following type: DIR A type representing a directory stream.

It shall also define the structure dirent which shall include the following members:

Читайте также:  Активатор windows 10 forum

The type ino_t shall be defined as described in .

The character array d_name is of unspecified size, but the number of bytes preceding the terminating null byte shall not exceed .

The following shall be declared as functions and may also be defined as macros. Function prototypes shall be provided.

The following sections are informative.

APPLICATION USAGE


RATIONALE

Information similar to that in the header is contained in a file in 4.2 BSD and 4.3 BSD. The equivalent in these implementations of struct dirent from this volume of IEEE Std 1003.1-2001 is struct direct . The filename was changed because the name was also used in earlier implementations to refer to definitions related to the older access method; this produced name conflicts. The name of the structure was changed because this volume of IEEE Std 1003.1-2001 does not completely define what is in the structure, so it could be different on some implementations from struct direct .

The name of an array of char of an unspecified size should not be used as an lvalue. Use of:

is incorrect; use:

The array of char d_name is not a fixed size. Implementations may need to declare struct dirent with an array size for d_name of 1, but the actual number of characters provided matches (or only slightly exceeds) the length of the filename.

FUTURE DIRECTIONS


SEE ALSO

, the System Interfaces volume of IEEE Std 1003.1-2001, closedir (), opendir (), readdir (), readdir_r (), rewinddir (), seekdir (), telldir ()

Источник

Struct dirent linux �

На одном из почтовых серверов у меня есть директория в которую складываются пришедшие письма. За некоторое время количество файлов в этой директории начинает превышать несколько тысяч и стандартной командой удаления rm *.eml удалить ничего не получается:

Связано это с тем, что Bash из маски *.eml делает длинную строку из списка файлов с расширением eml, поэтому количество аргументов для команды rm превышает допустимое количество. Естественно удалить такое количество файлов можно с использованием других команд, но интерес не в этом, а в том чтобы разобраться с функциями чтения директорий.

Итак, приступим. Для работы с директориями необходимо подключить файлы:

Директория сама по себе представляет файл состоящий из специальных записей dirent, которые содержат данные о файлах в директории:

Данная структура содержит имя файла d_name, порядковый номер файла d_ino в файловой системе и несколько других. Разберемся.

Для работы с директориями необходимо определить переменную типа DIR (по смыслу она похожа на тип FILE). Для открытия/закрытия директорий существует две функции:

Функция opendir() открывает директорию для чтения с именем name и возвращает указатель на directory stream (иногда сложно перевести со смыслом, директорный поток или поток директории ?), при ошибке возвращает NULL и соответствующим образом устанавливает код ошибки errno. Функция closedir() без комментариев.

Чтение из этого файла-директории осуществляется функциями со схожими названиями:

Первая функция readdir() возвращает следующую структуру dirent считанную из файла-директории. При достижении конца списка файлов в директории или возникновении ошибки возвращает NULL. Вторая функция должна использоваться для чтения содержимого директорий при разработке программ работающих в мультипоточном режиме.

Давайте попробуем прочитать какую-нибудь директорию:

Компилируем и запускаем:

Читайте также:  Все стартовые экраны windows

Из всего этого думаю полезностей извлечь можно не много. Думаю кроме имени файла d_name ничего особо полезного нет, но собственно больше ничего и не надо. Как и было написано в man 3 readdir поле d_type многие файловые системы не устанавливают (в примере используется reiserfs), а жаль. Судя по описанию уже по этому полю можно было бы определить тип записи: файл, директория или символьная ссылка. Ну ничего страшного.

Источник

Struct dirent linux �

This section describes what you find in a single directory entry, as you might obtain it from a directory stream. All the symbols are declared in the header file dirent.h .

Data Type: struct dirent

This is a structure type used to return information about directory entries. It contains the following fields:

This is the null-terminated file name component. This is the only field you can count on in all POSIX systems.

This is the file serial number. For BSD compatibility, you can also refer to this member as d_ino . On GNU/Linux and GNU/Hurd systems and most POSIX systems, for most files this the same as the st_ino member that stat will return for the file. See File Attributes.

unsigned char d_namlen

This is the length of the file name, not including the terminating null character. Its type is unsigned char because that is the integer type of the appropriate size. This member is a BSD extension. The symbol _DIRENT_HAVE_D_NAMLEN is defined if this member is available.

unsigned char d_type

This is the type of the file, possibly unknown. The following constants are defined for its value:

The type is unknown. Only some filesystems have full support to return the type of the file, others might always return this value.

A named pipe, or FIFO. See FIFO Special Files.

A local-domain socket.

A character device.

A symbolic link.

This member is a BSD extension. The symbol _DIRENT_HAVE_D_TYPE is defined if this member is available. On systems where it is used, it corresponds to the file type bits in the st_mode member of struct stat . If the value cannot be determined the member value is DT_UNKNOWN. These two macros convert between d_type values and st_mode values:

Function: int IFTODT (mode_t mode )

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

This returns the d_type value corresponding to mode .

Function: mode_t DTTOIF (int dtype )

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

This returns the st_mode value corresponding to dtype .

This structure may contain additional members in the future. Their availability is always announced in the compilation environment by a macro named _DIRENT_HAVE_D_ xxx where xxx is replaced by the name of the new member. For instance, the member d_reclen available on some systems is announced through the macro _DIRENT_HAVE_D_RECLEN .

When a file has multiple names, each name has its own directory entry. The only way you can tell that the directory entries belong to a single file is that they have the same value for the d_fileno field.

File attributes such as size, modification times etc., are part of the file itself, not of any particular directory entry. See File Attributes.

Источник

Русские Блоги

Подробное объяснение DIR, dirent, stat и других структур под Linux

Ниже приводится определение структуры DIR:

Читайте также:  Команда просмотр версии windows

Структура DIR аналогична FILE, который является внутренней структурой. Следующие функции используют эту внутреннюю структуру для сохранения соответствующей информации о каталоге, который в настоящее время читается (из«Расширенное программирование в среде UNIX (второе издание)»). Функция DIR * opendir (const char * pathname), открывающая файловый каталог, возвращает указатель на структуру DIR, которая используется следующими функциями:

За ним следует директивная структура. Во-первых, мы должны выяснить концепцию файла каталога: этот файл содержит имена других файлов и указатели на информацию, относящуюся к этим файлам (взятые из«Расширенное программирование в среде UNIX (второе издание)»). Из определения видно, что dirent не только указывает на каталог, но также указывает на конкретные файлы в каталоге.Функция readdir также считывает файлы в каталоге. Это свидетельство. Ниже приводится определение прямой структуры:

Из приведенного выше определения также видно, что структура dirent хранит очень мало информации о файлах, поэтому dirent также действует как индекс. Если вы хотите получить информацию о файле, аналогичную эффекту ls -l, вы должны положиться на функцию stat Вверх.

Имя файла, считываемое функцией readdir, сохраняется в члене d_name структуры dirent, а функция

int stat(const char *file_name, struct stat *buf);

Функция состоит в том, чтобы получить подробную информацию о файле с именем d_name и сохранить ее в структуре stat. Ниже приводится определение структуры статистики:

Наконец, чтобы подвести итог, что нам делать, если мы хотим получить подробную информацию о файлах b в определенном каталоге (например, под заголовком)?

Сначала мы используем функцию opendir, чтобы открыть каталог a и вернуть структуру DIR c, которая указывает на каталог a.

Затем мы вызываем функцию readdir (c) для чтения всех файлов (включая каталоги) в каталоге a и возвращаем структуру dirent d, которая указывает на все файлы в каталоге a.

Затем мы проходим d и вызываем stat (d-> name, stat * e), чтобы получить подробную информацию о каждом файле, которая хранится в структуре stat e.

В целом это такой постепенный процесс усовершенствования, в котором три структуры играют разные роли.

Во-первых, внутренняя структура в предложении «Структура DIR похожа на ФАЙЛ, это внутренняя структура», упомянутая выше, не очень ясна. Позже я увидел сообщение в блоге, в котором была представлена ​​структура ФАЙЛ, а именно:

«Структура файла структуры определена в include / linux / fs.h. Структура файла представляет собой открытый файл. Каждый открытый файл в системе имеет связанный файл структуры в пространстве ядра. Он открывается ядром. Файл создается при его создании и передается в любую функцию, которая работает с файлом. После закрытия всех экземпляров файла ядро ​​освобождает эту структуру данных. При создании ядра и исходном коде драйвера указатель на файл структуры обычно называется файлом или filp. . «

Здесь говорится, что структура FILE создается, когда ядро ​​открывает файл. Обратитесь к предыдущему коду операции FILE, мы можем обнаружить, что, когда мы используем структуру FILE, мы напрямую объявляем указатель на структуру FILE, например:

Затем используйте функцию fopen, чтобы вернуть указатель на структуру FILE на fp. Мы не объявляли структуру, а просто указатель на структуру.

Итак, я предполагаю, что выделение памяти конкретной структуры было выполнено ядром за нас.

Структура DIR похожа на FILE. В P104 «Linux Programming Fourth Edition» есть программа для печати всех файлов и каталогов в каталоге. Код выглядит следующим образом:

Источник

Оцените статью