READDIR(3)

BEZEICHNUNG
readdir, readdir_r - liest ein Verzeichnis

ÜBERSICHT
#include <dirent.h>

struct dirent *readdir(DIR *dirp);

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

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

readdir_r():
    _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE

BESCHREIBUNG
Die Funktion readdir() liefert einen Zeiger auf eine dirent-Struktur zurück, welche den nächsten Eintrag in dem Verzeichnis darstellt, auf das dirp weist. Falls das Dateiende erreicht wurde oder ein Fehler auftrat, wird ein NULL-Zeiger zurückgegeben.

Unter Linux ist die Struktur dirent wie folgt definiert:

struct dirent {
    ino_t          d_ino;       /* Inode-Nummer */
    off_t          d_off;       /* kein Offset; siehe ANMERKUNGEN */
    unsigned short d_reclen;    /* Länge dieses Datensatzes */
    unsigned char  d_type;      /* Dateityp; nicht von allen
                                   Dateisystemtypen unterstützt */
   char            d_name[256]; /* Dateiname */
};

POSIX.1 fordert in der dirent-Struktur lediglich die Felder d_name[] von nicht festgelegter Größe, mit höchstens NAME_MAX Zeichen vor dem abschließenden Null-Byte ('\0') sowie (als XSI-Erweiterung) d_ino. Die anderen Felder sind nicht standardisiert und nicht auf allen Systemen vorhanden; siehe die folgenden ANMERKUNGEN für einige weitere Details.

Die von readdir() zurückgegebenen Daten können bei nachfolgenden Aufrufen von readdir() für den gleichen Verzeichnis-Stream überschrieben werden.

Die Funktion readdir_r() ist eine ablaufinvariante Version von readdir(). Sie liest den nächsten Verzeichniseintrag aus dem Verzeichnis-Stream dirp und gibt diesen in den vom aufrufenden Prozess bereitgestellten Puffer, auf den entry weist, zurück. (Siehe ANMERKUNGEN für Informationen über die Bereitstellung dieses Puffers.) Ein Zeiger auf den zurückgegebenen Eintrag wird in *result platziert; falls das Ende der Verzeichnis-Streams erreicht wurde, wird stattdessen NULL in *result zurückgegeben.

RÜCKGABEWERT
Nach erfolgreichem Abschluss gibt readdir() einen Zeiger auf eine dirent-Struktur zurück. (Diese Struktur kann statisch bereitgestellt worden sein; versuchen Sie nicht, den Speicher mittels free(3) freizugeben.) Falls das Ende des Verzeichnis-Streams erreicht wird, ist der Rückgabewert NULL und errno wird nicht geändert. Wenn ein Fehler eintritt, wird NULL zurückgegeben und errno wird entsprechend gesetzt.

Bei Erfolg gibt die Funktion readdir_r() 0 zurück; im Fehlerfall eine positive Fehlernummer (aufgelistet unter ERRORS). Wenn das Ende des Verzeichnis-Streams erreicht wird, gibt readdir_r() 0 zurück, der Rückgabewert von *result ist dann NULL.

FEHLER

EBADF
    Unzulässiger Deskriptor für den Verzeichnis-Stream dirp.

ATTRIBUTE

  Multithreading (see pthreads(7))
The readdir() function is not thread-safe.

The readdir_r() function is thread-safe.

KONFORM ZU
SVr4, 4.3BSD, POSIX.1-2001.

ANMERKUNGEN
Von POSIX.1-2001 werden nur die Felder d_name und d_ino beschrieben. Die restlichen Felder sind auf vielen, aber nicht allen Systemen verfügbar. Unter Glibc können Programme die Verfügbarkeit der nicht von POSIX.1 definierten Felder überprüfen. Dazu müssen sie prüfen, ob die Makros _DIRENT_HAVE_D_NAMLEN, _DIRENT_HAVE_D_RECLEN, _DIRENT_HAVE_D_OFF oder _DIRENT_HAVE_D_TYPE definiert sind.

The value returned in d_off is the same as would be returned by calling telldir(3) at the current position in the directory stream. Be aware that despite its type and name, the d_off field is seldom any kind of directory offset on modern filesystems. Applications should treat this field as an opaque value, making no assumptions about its contents; see also telldir(3).

Das Feld d_type steht im Gegensatz zu Linux hauptsächlich nur auf BSD-Systemen zur Verfügung. Dieses Feld ermöglicht es, den Aufwand für den Aufruf von lstat(2) zu vermeiden, wenn weitere Aktionen von der Art der Datei abhängen. Wenn das Feature-Test-Makro _BSD_SOURCE definiert ist, definiert Glibc die folgenden Makro-Konstanten für den Rückgabewert von d_type:

DT_BLK
    Dies ist ein blockorientiertes Gerät.

DT_CHR
    Dies ist ein zeichenorientiertes Gerät.

DT_DIR
    Dies ist ein Verzeichnis.

DT_FIFO
    Dies ist ein FIFO (eine benannte Pipe).

DT_LNK
    Dies ist ein symbolischer Link.

DT_REG
    Dies ist eine reguläre Datei.

DT_SOCK
    Dies ist ein UNIX Domain Socket.

DT_UNKNOWN
    Der Dateityp ist unbekannt.

Wenn der Dateityp nicht bestimmt werden konnte, wird in d_type der Wert DT_UNKNOWN zurückgegeben.

Derzeit unterstützen nur ein paar Dateisysteme (darunter Btrfs, ext2, ext3 und ext4) die Rückgabe des Dateityps in d_type vollständig. Alle Anwendungen müssen mit dem Rückgabewert DT_UNKNOWN umgehen können.

Da POSIX.1 die Größe des Feldes d_name nicht festlegt und weitere nicht standardisierte Felder diesem Feld innerhalb der dirent-Struktur vorausgehen können, sollten portable Anwendungen, die readdir_r () verwenden, den Puffer, dessen Adresse in entry übergeben wird, wie folgt bereitstellen:

name_max = pathconf(dirpath, _PC_NAME_MAX);
if (name_max == -1)         /* Grenze nicht definiert, oder Fehler */
    name_max = 255;         /* etwas vermuten */
len = offsetof(struct dirent, d_name) + name_max + 1;
entryp = malloc(len);

(POSIX.1 fordert, dass d_name das letzte Feld in struct dirent ist.)

SIEHE AUCH
getdents(2), read(2), closedir(3), dirfd(3), ftw(3), offsetof(3), opendir(3), rewinddir(3), scandir(3), seekdir(3), telldir(3)

KOLOPHON
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Markus Kaufmann <markus.kaufmann@gmx.de>, Helge Kreutzmann <debian@helgefjell.de> und Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.