stat(2) System Calls Manual stat(2) NOM stat, fstat, lstat, fstatat - Obtenir l'etat d'un fichier (file status) BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int stat(const char *restrict chemin, struct stat *restrict statbuf); int fstat(int fd, struct stat *statbuf); int lstat(const char *restrict chemin, struct stat *restrict statbuf); #include /* Definition des constantes AT_* */ #include int fstatat(int dirfd, const char *restrict chemin, struct stat *restrict statbuf, int attributs); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : lstat() : /* Depuis la glibc 2.20 */ _DEFAULT_SOURCE || _XOPEN_SOURCE >= 500 || /* Depuis la glibc 2.10 : */ _POSIX_C_SOURCE >= 200112L || /* Pour la glibc anterieure et egale a 2.19 */ _BSD_SOURCE fstatat() : Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L avant la glibc 2.10 : _ATFILE_SOURCE DESCRIPTION Ces fonctions renvoient des renseignements sur le fichier indique, dans le tampon pointe par statbuf. Vous n'avez besoin d'aucun droit d'acces au fichier pour obtenir les informations, mais vous devez -- dans le cas de stat(), fstatat() et lstat() -- avoir le droit d'executer (search) sur tous les repertoires mentionnes dans le chemin menant au fichier. stat() et fstatat() recuperent des renseignements sur le fichier pointe par chemin. Les differences de fstatat() sont decrites ci-dessous : lstat() est identique a stat(), sauf que dans le cas ou chemin est un lien symbolique, auquel cas il renvoie des renseignements sur le lien lui-meme plutot que celui du fichier vise. fstat() est identique a stat(), sauf que le fichier dont les renseignements sont a recuperer est reference par le descripteur de fichier fd. La structure stat Les trois fonctions renvoient une structure stat (consultez stat(3type)). Note : pour des raisons de performance et de simplicite, differents champs dans la structure stat peuvent contenir des informations d'etat a differents moments durant l'execution de l'appel systeme. Par exemple, si st_mode ou st_uid sont modifies par un autre processus en appelant chmod(2) ou chown(2), stat() peut renvoyer l'ancien st_mode en meme temps que le nouveau st_uid ou l'ancien st_uid en meme temps que le nouveau st_mode. fstatat() L'appel systeme fstatat() est une interface plus generale pour acceder a des informations de fichier qui peut encore fournir exactement le comportement de chaque appel a stat(), lstat() et fstat(). Si le chemin donnee dans chemin est un chemin relatif, il est interprete par rapport au repertoire reference par le descripteur de fichier dirfd, (plutot que par rapport au repertoire courant du processus appelant, comme avec stat() et lstat() pour un chemin relatif). Si chemin est relatif, et si dirfd est la valeur speciale AT_FDCWD, chemin est interprete comme etant relatif au repertoire courant du processus appelant, comme stat() et lstat(). Si pathname est absolu, alors dirfd est ignore. L'argument attributs est soit 0, soit un OU binaire << | >> avec les options suivantes : AT_EMPTY_PATH (depuis Linux 2.6.39) Si chemin est une chaine vide, operer sur le fichier reference par dirfd (qui peut avoir ete obtenu en utilisant open(2) avec l'attribut O_PATH). Dans ce cas, dirfd peut referencer tout type de fichier, pas uniquement un repertoire et le comportement de fstatat() est similaire a celui de fstat(). Si dirfd est AT_FDCWD, l'appel opere sur le repertoire de travail actuel. Cet attribut est specifique a Linux, _GNU_SOURCE doit etre definie pour obtenir sa definition. AT_NO_AUTOMOUNT (depuis Linux 2.6.38) Ne pas monter automatiquement la partie terminal (<< basename >>) de chemin. Depuis Linux 3.1, cet attribut est ignore. Depuis Linux 4.11, cet attribut est implicite. AT_SYMLINK_NOFOLLOW Si chemin est un lien symbolique, ne pas le dereferencer, mais renvoyer des informations sur le lien lui-meme, comme le fait lstat(2). (Par defaut, fstatat() dereference les liens symboliques, comme stat(2).) Consultez openat(2) pour une explication de la necessite de fstatat(). VALEUR RENVOYEE En cas de succes, zero est renvoye. En cas d'erreur, -1 est renvoye et errno est definie pour preciser l'erreur. ERREURS EACCES La permission de parcours est refusee pour un des repertoires contenu dans le chemin nom_chemin. (Consultez aussi path_resolution(7).) EBADF Le descripteur de fichier fd est non valable. EBADF (fstatat()) chemin est relatif mais dirfd n'est ni AT_FDCWD ni un descripteur de fichier valable. EFAULT Un pointeur se trouve en dehors de l'espace d'adressage. EINVAL (fstatat()) attributs contient un attribut non valable. ELOOP Trop de liens symboliques rencontres dans le chemin d'acces. ENAMETOOLONG nom_chemin est trop long. ENOENT Un composant du chemin d'acces chemin n'existe pas ou est un lien symbolique pointant nulle part. ENOENT chemin est une chaine vide et AT_EMPTY_PATH n'a pas ete specifie dans attributs. ENOMEM Pas assez de memoire (memoire noyau). ENOTDIR Un element du prefixe de chemin n'est pas un repertoire. ENOTDIR (fstatat()) chemin est relatif et dirfd est un descripteur de fichier faisant reference a un fichier qui n'est pas un dossier. EOVERFLOW chemin ou fd font reference a un fichier dont la taille, l'inoeud ou le nombre de blocs ne peut pas etre represente respectivement avec le type off_t, ino_t ou blkcnt_t. Cela peut arriver par exemple quand une application compilee sans l'option -D_FILE_OFFSET_BITS=64 sur une plate-forme 32 bits appelle stat() pour un fichier dont la taille est superieure a (1<<31)-1 octets. STANDARDS POSIX.1-2008. HISTORIQUE stat() fstat() lstat() SVr4, 4.3BSD, POSIX.1-2001. fstatat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. D'apres POSIX.1-2001, lstat() sur un lien symbolique ne doit renvoyer des informations valables que dans le champ st_size et le type de fichier du champ st_mode de la structure stat. POSIX.1-2008 renforce la specification, obligeant lstat() a renvoyer des informations valables dans tous les champs a part les bits de mode dans st_mode. L'utilisation des champs st_blocks et st_blksize risque d'etre moins portable (ils ont ete introduits dans BSD. Leur interpretation change suivant les systemes, voire sur un meme systeme s'il y a des montages NFS). Differences entre bibliotheque C et noyau Avec le temps, l'augmentation de la taille de la structure stat a conduit a trois versions successives de stat() : sys_stat() (slot __NR_oldstat), sys_newstat() (slot __NR_stat) et sys_stat64() __NR_stat64) sur les plateformes 32 bits telles que i386. Les deux premieres versions etaient deja presentes dans Linux 1.0 (quoiqu'avec des noms differents), la derniere a ete ajoutee dans Linux 2.4. La meme remarque s'applique a fstat() et lstat(). Les versions internes du noyau de la structure stat traitees par les differentes versions etaient respectivement : __old_kernel_stat La structure d'origine avec des champs plutot etroits et pas de remplissage. stat Un champ plus grand st_ino et le remplissage ont ete ajoutes dans differentes parties de la structure pour autoriser un agrandissement futur. stat64 Un champ st_ino encore plus grand, des champs st_uid et st_gid plus grands pour s'adapter a l'extension a 32 bits des UID et GID dans Linux 2.4 et d'autres champs agrandis ainsi que plus de remplissage dans la structure. (Divers octets de remplissage etaient finalement consommes dans Linux 2.6 avec l'introduction d'ID de peripherique 32 bits et des composants en nanosecondes dans les champs d'horodatage.) La fonction d'enveloppe stat() de la glibc dissimule ces details aux applications invoquant la version la plus recente de l'appel systeme fourni par le noyau, et recompresse l'information renvoyee si necessaire pour les binaires anciens. Dans les systemes modernes 64 bits, la vie est plus simple : il n'y a qu'un seul appel systeme stat() et le noyau s'occupe de la structure stat qui contient des champs d'une taille suffisante. L'appel systeme sous-jacent employe par la fonction d'enveloppe fstatat() de la glibc s'appelle en fait fstatat64() ou, sur certaines architectures, newfstatat(). EXEMPLES Le programme suivant appelle lstat() et affiche certains champs selectionnes dans la structure stat renvoyee. #include #include #include #include #include #include int main(int argc, char *argv[]) { struct stat sb; if (argc != 2) { fprintf(stderr, "Utilisation : %s \n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } printf("ID du peripherique contenant : [%x,%x]\n", major(sb.st_dev), minor(sb.st_dev)); printf("Type de fichier : "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("peripherique caractere\n"); break; case S_IFDIR: printf("repertoire\n"); break; case S_IFIFO: printf("FIFO/tube\n"); break; case S_IFLNK: printf("lien symbolique\n"); break; case S_IFREG: printf("fichier ordinaire\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("inconnu ?\n"); break; } printf("Numero d'inoeud : %ju\n", (uintmax_t) sb.st_ino); printf("Mode: %jo (octal)\n", (uintmax_t) sb.st_mode); printf("Nombre de liens : %ju\n", (uintmax_t) sb.st_nlink); printf("Proprietaires : UID=%ju GID=%ju\n", (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid); printf("Taille de bloc d'E/S : %jd bytes\n", (intmax_t) sb.st_blksize); printf("Taille du fichier %jd bytes\n", (intmax_t) sb.st_size); printf("Blocs alloues : %jd\n", (intmax_t) sb.st_blocks); printf("Dernier changement d'etat : %s", ctime(&sb.st_ctime)); printf("Dernier acces au fichier : %s", ctime(&sb.st_atime)); printf("Derniere modification du fichier : %s", ctime(&sb.st_mtime)); exit(EXIT_SUCCESS); } VOIR AUSSI ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), statx(2), utime(2), stat(3type), capabilities(7), inode(7), symlink(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-Pierre Giraud 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.06 31 octobre 2023 stat(2)