getdents(2) System Calls Manual getdents(2) BEZEICHNUNG getdents, getdents64 - Verzeichniseintrage ermitteln BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include /* Definition der SYS_*-Konstanten */ #include long syscall(SYS_getdents, unsigned int dd, struct linux_dirent *Verzz, unsigned int Zahler); #define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include ssize_t getdents64(int fd, void Verzz[.Zahler], size_t Zahler); Hinweis: Glibc stellt keinen Wrapper fur getdents() bereit; rufen Sie es mittels syscall(2) auf. Hinweis: Es gibt in Glibc keine Definition von struct linux_dirent; siehe ANMERKUNGEN. BESCHREIBUNG Dies sind nicht die Schnittstellen, an der Sie interessiert sind. Lesen Sie readdir(3) fur die POSIX-konforme C-Bibliotheksschnittstelle. Diese Seite dokumentiert die nackten Kernel-Systemaufruf-Schnittstellen. getdents() Der Systemaufruf getdents() liest mehrere linux_dirent-Strukturen aus dem Verzeichnis, auf das der offene Dateideskriptor dd verweist, in den Puffer, auf den Verzz zeigt. Das Argument Zahler spezifiziert die Grosse dieses Puffers. Die Struktur linux_dirent ist wie folgt deklariert: struct linux_dirent { unsigned long d_ino; /* Inode-Nummer */ unsigned long d_off; /* Versatz zum nachsten linux_dirent */ unsigned short d_reclen; /* Lange dieses linux_dirent */ char d_name[]; /* Dateiname (abgeschlossen mit */ /* Nullbytes) */ /* Tatsachlich ist die Lange (d_reclen - 2 - offsetof(struct linux_dirent, d_name)) */ /* char pad; // Null-Byte zum Auffullen char d_type; // Dateityp (nur seit Linux 2.6.4); // Versatz betragt (d_reclen - 1) */ } d_ino ist eine Inode-Nummer. d_off ist der Abstand zwischen dem Anfang des Verzeichnisses und dem Anfang des nachsten linux_dirent. d_reclen ist die Grosse dieses gesamten linux_dirent. d_name ist ein mit NULL abgeschlossener Dateiname. d_type ist ein Byte am Ende der Struktur, das den Dateityp anzeigt. Es enthalt einen der folgenden Werte (definiert in ): DT_BLK Dies ist ein blockorientiertes Gerat. DT_CHR Dies ist ein zeichenorientiertes Gerat. 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 regulare Datei. DT_SOCK Dies ist ein UNIX Domain Socket. DT_UNKNOWN Der Dateityp ist unbekannt. Das d_type-Feld wird seit Linux 2.6.4 implementiert. Es nimmt den Raum ein, der zuvor ein auf Null gesetztes Fullbyte in der linux_dirent-Struktur war. So ergibt mit Kerneln bis einschliesslich Linux 2.6.3 ein versuchter Zugriff auf dieses Feld immer den Wert 0 (DT_UNKNOWN). Derzeit unterstutzen nur ein paar Dateisysteme (darunter Btrfs, ext2, ext3 und ext4) die Ruckgabe des Dateityps in d_type vollstandig. Alle Anwendungen mussen mit dem Ruckgabewert DT_UNKNOWN umgehen konnen. getdents64() Der ursprungliche Linux-Systemaufuf getdents() konnte nicht mit grossen Dateisystemen und grossen Dateioffsets umgehen. Folglich wurde in Linux 2.4 getdents64() hinzugefugt, mit >>breiteren<< Typen fur die Felder d_ino und d_off in der linux_dirent-Struktur. Zusatzlich unterstutzt getdents64() ein explizites d_type-Feld. Der getdents64()-Systemaufruf ahnelt dem von getdents(), ausser dass das zweite Argument ein Zeiger auf einen Puffer ist, der Strukturen des folgenden Typs enthalt: struct linux_dirent64 { ino64_t d_ino; /* 64-bit-Inode-Nummer */ off64_t d_off; /* 64-bit-Offset zur nachsten Struktur */ unsigned short d_reclen; /* Grosse dieses Verzeichniseintrags */ unsigned char d_type; /* Dateityp */ char d_name[]; /* Dateiname (null-terminiert) */ }; RUCKGABEWERT Bei Erfolg wird die Anzahl der gelesenen Bytes zuruckgeliefert. Am Verzeichnisende wird 0 zuruckgeliefert. Im Fehlerfall wird -1 zuruckgeliefert und errno gesetzt, um den Fehler anzuzeigen. FEHLER EBADF Unzulassiger Dateideskriptor dd. EFAULT Das Argument zeigt aus dem Adressraum des aufrufenden Prozesses heraus. EINVAL Ergebnispuffer ist zu klein. ENOENT Kein solches Verzeichnis. ENOTDIR Dateideskriptor zeigt nicht auf ein Verzeichnis. STANDARDS Keine. GESCHICHTE SVr4. getdents64() Glibc 2.30. ANMERKUNGEN Glibc stellt keinen Wrapper fur getdents() bereit. Der Aufruf von getdents() benotigt die Verwendung von syscall(2). In diesem Fall mussen Sie die Struktur linux_dirent64 selbst definieren. Wahrscheinlich mochten Sie readdir(3) statt einer dieser Systemaufrufe verwenden. Diese Aufrufe ersetzen readdir(2). BEISPIELE Das nachfolgende Programm zeigt die Verwendung von getdents(). Die folgende Ausgabe zeigt ein Beispiel davon, was bei der Ausfuhrung des Programms auf einem Ext2-Verzeichnis gesehen werden kann. $ ./a.out /testfs/ --------------- 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 Programmquelltext #define _GNU_SOURCE #include /* Definiert DT_*-Konstanten */ #include #include #include #include #include #include #include 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; char d_type; char buf[BUF_SIZE]; long nread; struct linux_dirent *d; fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); if (fd == -1) err(EXIT_FAILURE, "open"); for (;;) { nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == -1) err(EXIT_FAILURE, "getdents"); if (nread == 0) break; printf("--------------- nread=%ld ---------------\n", nread); printf("inode# file type d_reclen d_off d_name\n"); for (size_t bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); printf("%8lu ", 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\n", d->d_reclen, (intmax_t) d->d_off, d->d_name); bpos += d->d_reclen; } } exit(EXIT_SUCCESS); } SIEHE AUCH readdir(2), readdir(3), inode(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann , Martin Eberhard Schauer und Mario Blattermann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 getdents(2)