readdir(2)

READDIR(2) Руководство программиста Linux READDIR(2)

ИМЯ

readdir - читает элемент каталога

ОБЗОР

int readdir(unsigned int fd, struct old_linux_dirent *dirp,
            unsigned int count);

Замечание: В glibc нет обёрточной функции для данного системного вызова; смотрите ЗАМЕЧАНИЯ.

ОПИСАНИЕ

Эта не та функция, которая должна представлять для вас интерес. Смотрите описание функции readdir(3), которая является интерфейсом библиотеки языка C, соответствующим стандарту POSIX. В этой странице описан минимальный интерфейс системного вызова ядра, который заменён на getdents(2).

Вызов readdir() читает структуру old_linux_dirent из каталога, заданного файловым дескриптором fd, в буфер, указываемый в dirp. Аргумент count игнорируется; всегда считывается только одна структура old_linux_dirent.

Структура old_linux_dirent определена (в файле ядра Linux fs/readdir.c, недоступна извне) следующим образом:


struct old_linux_dirent {

unsigned long d_ino; /* номер иноды */
unsigned long d_offset; /* смещение на данную old_linux_dirent */
unsigned short d_namlen; /* длина данной d_name */
char d_name[1]; /* имя файла (с null в конце) */ }

Значением d_ino является номер иноды. В d_offset задаётся смещение данной old_linux_dirent от начала каталога. В d_reclen задаётся размер d_name без учета завершающего байта null ('\0'). В d_name указывается имя файла, завершающееся null.

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

При успешном выполнении возвращается 1. Если каталог закончился возвращается 0. При ошибке возвращается -1, а переменной errno присваивается номер ошибки.

ОШИБКИ

EBADF
Неверный файловый дескриптор fd.
EFAULT
Аргумент указывает за пределы адресного пространства вызывающего процесса.
EINVAL
Буфер результата слишком мал.
ENOENT
Заданный каталог не существует.
ENOTDIR
Файловый дескриптор указывает не на каталог.

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

Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

В glibc нет обёртки для данного системного вызова; запускайте его с помощью syscall(2). Структуру old_linux_dirent нужно определить самостоятельно. Однако лучше использовать readdir(3).

Этот системный вызов отсутствует на x86-64.

СМОТРИТЕ ТАКЖЕ

getdents(2), readdir(3)

2019-03-06 Linux