.\" -*- coding: UTF-8 -*- .\" Copyright (C) 1995 Andries Brouwer (aeb@cwi.nl) .\" and Copyright 2008, 2015 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Written 11 June 1995 by Andries Brouwer .\" Modified 22 July 1995 by Michael Chastain : .\" Derived from 'readdir.2'. .\" Modified Tue Oct 22 08:11:14 EDT 1996 by Eric S. Raymond .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH GETDENTS 2 "1. November 2020" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG getdents, getdents64 \- Verzeichniseinträge ermitteln .SH ÜBERSICHT .nf \fBlong getdents(unsigned int \fP\fIdd\fP\fB, struct linux_dirent *\fP\fIVerzz\fP\fB,\fP \fB unsigned int \fP\fIZähler\fP\fB);\fP .PP \fB#define _GNU_SOURCE\fP /* siehe feature_test_macros(7) */ \fB#include \fP .PP \fBssize_t getdents64(int \fP\fIdd\fP\fB, void *\fP\fIVerzz\fP\fB, size_t \fP\fIZähler\fP\fB);\fP .fi .PP \fIHinweis\fP: Es gibt keinen Glibc\-Wrapper für \fBgetdents\fP(); siehe ANMERKUNGEN. .SH BESCHREIBUNG Dies sind nicht die Schnittstellen, an der Sie interessiert sind. Lesen Sie \fBreaddir\fP(3) für die POSIX\-konforme C\-Bibliotheksschnittstelle. Diese Seite dokumentiert die nackten Kernel\-Systemaufruf\-Schnittstellen. .SS getdents() Der Systemaufruf \fBgetdents\fP() liest mehrere \fIlinux_dirent\fP\-Strukturen aus dem Verzeichnis, auf das der offene Dateideskriptor \fIdd\fP verweist, in den Puffer, auf den \fIVerzz\fP zeigt. Das Argument \fIZähler\fP spezifiziert die Größe dieses Puffers. .PP Die Struktur \fIlinux_dirent\fP ist wie folgt deklariert: .PP .in +4n .EX struct linux_dirent { unsigned long d_ino; /* Inode\-Nummer */ unsigned long d_off; /* Offset zum nächsten \fIlinux_dirent\fP */ unsigned short d_reclen; /* Länge dieses \fIlinux_dirent\fP */ char d_name[]; /* Dateiname (abgeschlossen mit */ /* NULL\-Byte */ /* Tatsächlich ist die Länge (d_reclen \- 2 \- offsetof(struct linux_dirent, d_name)) */ /* char pad; // NULL\-Byte zum Auffüllen char d_type; // Dateityp (nur seit Linux 2.6.4); // Offset beträgt (d_reclen \- 1) */ } .EE .in .PP \fId_ino\fP ist eine Inode\-Nummer. \fId_off\fP ist der Abstand zwischen dem Anfang des Verzeichnisses und dem Anfang des nächsten \fIlinux_dirent\fP. \fId_reclen\fP ist die Größe dieses gesamten \fIlinux_dirent\fP. \fId_name\fP ist ein nullterminierter Dateiname. .PP \fId_type\fP ist ein Byte am Ende der Struktur, das den Dateityp anzeigt. Es enthält einen der folgenden Werte (definiert in \fI\fP): .TP 12 \fBDT_BLK\fP Dies ist ein blockorientiertes Gerät. .TP \fBDT_CHR\fP Dies ist ein zeichenorientiertes Gerät. .TP \fBDT_DIR\fP Dies ist ein Verzeichnis. .TP \fBDT_FIFO\fP Dies ist ein FIFO (eine benannte Pipe). .TP \fBDT_LNK\fP Dies ist ein symbolischer Link. .TP \fBDT_REG\fP Dies ist eine reguläre Datei. .TP \fBDT_SOCK\fP Dies ist ein UNIX Domain Socket. .TP \fBDT_UNKNOWN\fP Der Dateityp ist unbekannt. .PP Das \fId_type\fP\-Feld wird seit Linux 2.6.4 implementiert. Es nimmt den Raum ein, der zuvor ein auf Null gesetztes Füllbyte in der \fIlinux_dirent\fP\-Struktur war. So ergibt mit Kerneln bis einschließlich 2.6.3 ein versuchter Zugriff auf dieses Feld immer den Wert 0 (\fBDT_UNKNOWN\fP). .PP .\" kernel 2.6.27 .\" The same sentence is in readdir.2 Derzeit unterstützen nur ein paar Dateisysteme (darunter Btrfs, ext2, ext3 und ext4) die Rückgabe des Dateityps in \fId_type\fP vollständig. Alle Anwendungen müssen mit dem Rückgabewert \fBDT_UNKNOWN\fP umgehen können. .SS getdents64() Der ursprüngliche Linux\-Systemaufuf \fBgetdents\fP() konnte nicht mit großen Dateisystemen und großen Dateioffsets umgehen. Folglich wurde in Linux 2.4 \fBgetdents64\fP() hinzugefügt, mit »breiteren« Typen für die Felder \fId_ino\fP und \fId_off\fP in der \fIlinux_dirent\fP\-Struktur. Zusätzlich unterstützt \fBgetdents64\fP() ein explizites \fId_type\fP\-Feld. .PP Der \fBgetdents64\fP()\-Systemaufruf ähnelt dem von \fBgetdents\fP(), außer dass das zweite Argument ein Zeiger auf einen Puffer ist, der Strukturen des folgenden Typs enthält: .PP .in +4n .EX struct linux_dirent64 { ino64_t d_ino; /* 64\-bit\-Inode\-Nummer */ off64_t d_off; /* 64\-bit\-Offset zur nächsten Struktur */ unsigned short d_reclen; /* Größe dieses Verzeichniseintrags */ unsigned char d_type; /* Dateityp */ char d_name[]; /* Dateiname (null\-terminiert) */ }; .EE .in .SH RÜCKGABEWERT Bei Erfolg wird die Anzahl der gelesenen Bytes zurückgeliefert. Am Verzeichnisende wird 0 zurückgeliefert. Im Fehlerfall wird \-1 zurückgeliefert und \fIerrno\fP entsprechend gesetzt. .SH FEHLER .TP \fBEBADF\fP Unzulässiger Dateideskriptor \fIdd\fP. .TP \fBEFAULT\fP Das Argument zeigt aus dem Adressraum des aufrufenden Prozesses heraus. .TP \fBEINVAL\fP Ergebnispuffer ist zu klein. .TP \fBENOENT\fP Kein solches Verzeichnis. .TP \fBENOTDIR\fP Dateideskriptor zeigt nicht auf ein Verzeichnis. .SH "KONFORM ZU" .\" SVr4 documents additional ENOLINK, EIO error conditions. SVr4. .SH ANMERKUNGEN Bibliotheksunterstützung für \fBgetdents64\fP() wurde in Glibc 2.30 hinzugefügt, es gibt keinen Glibc\-Wrapper für \fBgetdents\fP(). Der Aufruf von \fBgetdents\fP() (oder \fBgetdents64\fP() unter älteren Glibc\-Versionen) benötigt die Verwendung von \fBsyscall\fP(2). In diesem Fall müssen Sie die Struktur \fIlinux_dirent64\fP selbst definieren. .PP Wahrscheinlich möchten Sie \fBreaddir\fP(3) statt einer dieser Systemaufrufe verwenden. .PP Diese Aufrufe ersetzen \fBreaddir\fP(2). .SH BEISPIELE .\" FIXME The example program needs to be revised, since it uses the older .\" getdents() system call and the structure with smaller field widths. Das nachfolgende Programm zeigt die Verwendung von \fBgetdents\fP(). Die folgende Ausgabe zeigt ein Beispiel davon, was bei der Ausführung des Programms auf einem Ext2\-Verzeichnis gesehen werden kann. .PP .in +4n .EX $\fB ./a.out /testfs/\fP \-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=120 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\- inode# file type d_reclen d_off d_name 2 directory 16 12 . 2 directory 16 24 .. 11 directory 24 44 lost+found 12 regular 16 56 a 228929 directory 16 68 sub 16353 directory 16 80 sub2 130817 directory 16 4096 sub3 .EE .in .SS Programmquelltext \& .EX #define _GNU_SOURCE #include /* Definiert DT_*\-Konstanten */ #include #include #include #include #include #include #include #define handle_error(msg) \e do { perror(msg); exit(EXIT_FAILURE); } while (0) struct linux_dirent { unsigned long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int fd; long nread; char buf[BUF_SIZE]; struct linux_dirent *d; char d_type; fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); if (fd == \-1) handle_error("open"); for (;;) { nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == \-1) handle_error("getdents"); if (nread == 0) break; printf("\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=%d \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\en", nread); printf("inode# file type d_reclen d_off d_name\en"); for (long bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); printf("%8ld ", d\->d_ino); d_type = *(buf + bpos + d\->d_reclen \- 1); printf("%\-10s ", (d_type == DT_REG) ? "regular" : (d_type == DT_DIR) ? "directory" : (d_type == DT_FIFO) ? "FIFO" : (d_type == DT_SOCK) ? "socket" : (d_type == DT_LNK) ? "symlink" : (d_type == DT_BLK) ? "block dev" : (d_type == DT_CHR) ? "char dev" : "???"); printf("%4d %10jd %s\en", d\->d_reclen, (intmax_t) d\->d_off, d\->d_name); bpos += d\->d_reclen; } } exit(EXIT_SUCCESS); } .EE .SH "SIEHE AUCH" \fBreaddir\fP(2), \fBreaddir\fP(3), \fBinode\fP(7) .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann , Martin Eberhard Schauer und Mario Blättermann erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE 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 die .MT debian-l10n-german@\:lists.\:debian.\:org Mailingliste der Übersetzer .ME .