getdents(2) System Calls Manual getdents(2) NOM getdents, getdents64 - Obtenir les points d'entree d'un repertoire BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes SYS_* */ #include long syscall(SYS_getdents, unsigned int fd, struct linux_dirent *dirp, unsigned int count); #define _GNU_SOURCE /* Voir feature_test_macros(7) */ #include ssize_t getdents64(size_t count; int fd, void dirp[count], size_t count); Remarque : la glibc ne fournit pas de fonction autour de getdents(), necessitant l'utilisation de syscall(2). Remarque : il n'existe pas de definition de struct linux_dirent dans la glibc ; voir les NOTES. DESCRIPTION These are not the interfaces you are interested in. Look at readdir(3) for the POSIX-conforming C library interface. getdents() L'appel systeme getdents() lit plusieurs structures linux_dirent depuis le repertoire reference par le descripteur de fichier ouvert fd et les place dans la zone de memoire pointee par dirp. Le parametre count specifie la taille de cette zone memoire. La structure linux_dirent est declaree comme ceci : struct linux_dirent { unsigned long d_ino; /* Inode number */ unsigned long d_off; /* Not an offset; see below */ unsigned short d_reclen; /* Length of this linux_dirent */ char d_name[]; /* Filename (null-terminated) */ /* length is actually (d_reclen - 2 - offsetof(struct linux_dirent, d_name)) */ /* char pad; // Zero padding byte char d_type; // File type (only since Linux // 2.6.4); offset is (d_reclen - 1) */ } d_ino est un numero d'inoeud. d_off est une valeur specifique au systeme de fichiers sans signification particuliere pour l'espace utilisateur, bien que pour les systemes de fichiers plus anciens, c'etait la distance entre le debut du repertoire et le debut de la prochaine structure linux_dirent ; voir readdir(3). d_reclen est la taille complete de linux_dirent. d_name est le nom de fichier termine par un caractere NULL. d_type est un octet place a la fin de la structure qui indique le type du fichier. Il contient l'une des valeurs suivantes (definies dans ) : DT_BLK Il s'agit d'un peripherique bloc. DT_CHR Il s'agit d'un peripherique caractere. DT_DIR Il s'agit d'un repertoire DT_FIFO Il s'agit d'un tube nomme (FIFO). DT_LNK Il s'agit d'un lien symbolique. DT_REG Il s'agit d'un fichier ordinaire. DT_SOCK Il s'agit d'un socket de domaine UNIX. DT_UNKNOWN Le type du fichier est inconnu. Le champ d_type est implemente depuis Linux 2.6.4. Il occupe un espace qui etait auparavant un octet de remplissage compose de zeros dans la structure linux_dirent. Ainsi, sur les noyaux anterieurs ou egaux a 2.6.3, les acces a ce champ fournissent toujours la valeur 0 (DT_UNKNOWN). Actuellement, seuls certains systemes de fichiers (parmi lesquels Btrfs, ext2, ext3 et ext4) prennent completement en charge le renvoi du type de fichier dans d_type. Toutes les applications doivent gerer correctement une valeur de retour valant DT_UNKNOWN. getdents64() L'appel systeme getdents() original de Linux ne permettait pas de gerer les gros systemes de fichiers et les positions dans les gros fichiers. En consequence, Linux 2.4 a ajoute getdents64(), avec des types plus larges pour les champs d_ino et d_off. De plus, getdents64() gere un champ explicite d_type. L'appel systeme getdents64() est comme getdents(), sauf que son deuxieme parametre est un pointeur vers un tampon contenant des structures de type suivant : struct dirent { ino64_t d_ino; /* numero d'inoeud 64 bits */ off64_t d_off; /* Pas une position ; voir plus bas */ unsigned short d_reclen; /* longueur de ce dirent */ unsigned char d_type; /* type du fichier */ char d_name[]; /* nom du fichier (termine par NULL) */ }; VALEUR RENVOYEE En cas de reussite, le nombre d'octets est renvoye. En fin de repertoire, 0 est renvoye. En cas d'erreur, -1 est renvoye, auquel cas errno est positionne pour indiquer l'erreur. ERREURS EBADF fd n'est pas un descripteur de fichier valable. EFAULT L'argument pointe en dehors de l'espace d'adressage du processus appelant. EINVAL Le tampon de resultat est trop petit. ENOENT Repertoire inexistant. ENOTDIR Le descripteur de fichier ne pointe pas sur un repertoire. NORMES Aucun. HISTORIQUE getdents() SVr4. getdents64() glibc 2.30. NOTES glibc does not provide a wrapper for getdents(); call getdents() using syscall(2). In that case you will need to define the linux_dirent structure yourself. The getdents64() system call accepts an unsigned int argument count and assumes that count does not exceed INT_MAX. The glibc wrapper function sets count to INT_MAX if it exceeds INT_MAX. glibc defines a dirent64 structure, which is similar to linux_dirent64 but with a 256-byte d_name. Vous voudrez probablement utiliser readdir(3) a la place de ces appels systeme. Ces appels remplacent readdir(2). EXEMPLES Le programme ci-dessous demontre l'utilisation de getdents(). La sortie suivante montre un exemple de ce que donne le programme sur un repertoire ext2 : $ ./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 Source du programme #define _GNU_SOURCE #include /* Definir les constantes DT_* */ #include #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("inoeud# type de fichier 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) ? "regulier" : (d_type == DT_DIR) ? "repertoire" : (d_type == DT_FIFO) ? "FIFO" : (d_type == DT_SOCK) ? "socket" : (d_type == DT_LNK) ? "liens symboliques" : (d_type == DT_BLK) ? "bloc de periph" : (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); } VOIR AUSSI readdir(2), readdir(3), inode(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.18 8 avril 2026 getdents(2)