plucky (2) fstat.2.gz

Provided by: manpages-fr-dev_4.25.1-1_all bug

NOM

       stat, fstat, lstat, fstatat - Obtenir l'état d'un fichier (file status)

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/stat.h>

       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 <fcntl.h>           /* Définition des constantes AT_* */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *restrict chemin,
                struct stat *restrict statbuf, int attributs);

   Exigences de macros de test de fonctionnalités 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 antérieure et égale à 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 indiqué, dans le tampon pointé par statbuf.
       Vous n'avez besoin d'aucun droit d'accès au fichier pour obtenir les informations, mais vous devez — dans
       le  cas  de  stat(),  fstatat()  et lstat() — avoir le droit d'exécuter (search) sur tous les répertoires
       mentionnés dans le chemin menant au fichier.

       stat() et fstatat() récupèrent des renseignements sur le fichier pointé par chemin.  Les  différences  de
       fstatat() sont décrites ci-dessous :

       lstat()  est  identique  à  stat(),  sauf que dans le cas où chemin est un lien symbolique, auquel cas il
       renvoie des renseignements sur le lien lui-même plutôt que celui du fichier visé.

       fstat() est identique à stat(), sauf que  le  fichier  dont  les  renseignements  sont  à  récupérer  est
       référencé 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 simplicité, différents champs dans la structure stat peuvent
       contenir des informations d'état à différents moments durant l'exécution de l'appel système. Par exemple,
       si  st_mode  ou st_uid sont modifiés par un autre processus en appelant chmod(2) ou chown(2), stat() peut
       renvoyer l'ancien st_mode en même temps que le nouveau st_uid ou l'ancien st_uid en  même  temps  que  le
       nouveau st_mode.

   fstatat()
       L'appel  système fstatat() est une interface plus générale pour accéder à des informations de fichier qui
       peut encore fournir exactement le comportement de chaque appel à stat(), lstat() et fstat().

       Si le chemin donnée dans chemin est un chemin relatif,  il  est  interprété  par  rapport  au  répertoire
       référencé par le descripteur de fichier dirfd, (plutôt que par rapport au répertoire courant du processus
       appelant, comme avec stat() et lstat() pour un chemin relatif).

       Si chemin est relatif, et si dirfd est la valeur spéciale AT_FDCWD, chemin  est  interprété  comme  étant
       relatif au répertoire courant du processus appelant, comme stat() et lstat().

       Si pathname est absolu, alors dirfd est ignoré.

       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  chaîne  vide,  opérer sur le fichier référencé par dirfd (qui peut avoir été
              obtenu en utilisant open(2) avec l’attribut O_PATH). Dans ce cas, dirfd peut référencer tout  type
              de  fichier, pas uniquement un répertoire et le comportement de fstatat() est similaire à celui de
              fstat(). Si dirfd est AT_FDCWD, l’appel opère sur le répertoire de travail  actuel.  Cet  attribut
              est spécifique à Linux, _GNU_SOURCE doit être définie pour obtenir sa définition.

       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 ignoré. Depuis Linux 4.11, cet attribut est implicite.

       AT_SYMLINK_NOFOLLOW
              Si chemin est un lien symbolique, ne pas le déréférencer, mais renvoyer des  informations  sur  le
              lien  lui‐même,  comme le fait lstat(2). (Par défaut, fstatat() déréférence les liens symboliques,
              comme stat(2).)

       Consultez openat(2) pour une explication de la nécessité de fstatat().

VALEUR RENVOYÉE

       En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno est  définie  pour  préciser
       l'erreur.

ERREURS

       EACCES La  permission  de parcours est refusée pour un des répertoires 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 rencontrés dans le chemin d'accès.

       ENAMETOOLONG
              nom_chemin est trop long.

       ENOENT Un composant du chemin d'accès chemin n'existe pas ou est un lien symbolique pointant nulle part.

       ENOENT chemin est une chaîne vide et AT_EMPTY_PATH n'a pas été spécifié dans attributs.

       ENOMEM Pas assez de mémoire (mémoire noyau).

       ENOTDIR
              Un élément du préfixe de chemin n'est pas un répertoire.

       ENOTDIR
              (fstatat()) chemin est relatif et dirfd est un descripteur  de  fichier  faisant  référence  à  un
              fichier qui n'est pas un dossier.

       EOVERFLOW
              chemin ou fd font référence à un fichier dont la taille, l'inœud ou le nombre de blocs ne peut pas
              être représenté respectivement avec le type off_t,  ino_t  ou  blkcnt_t.  Cela  peut  arriver  par
              exemple  quand  une  application compilée sans l'option -D_FILE_OFFSET_BITS=64 sur une plate-forme
              32 bits appelle stat() pour un fichier dont la taille est supérieure à (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'après 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
       spécification, obligeant lstat() à renvoyer des informations valables dans tous les  champs  à  part  les
       bits de mode dans st_mode.

       L'utilisation  des  champs  st_blocks  et st_blksize risque d'être moins portable (ils ont été introduits
       dans BSD. Leur interprétation change suivant les systèmes, voire  sur  un  même  système  s'il  y  a  des
       montages NFS).

   Différences entre bibliothèque C et noyau
       Avec le temps, l'augmentation de la taille de la structure stat a conduit à 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  premières  versions étaient déjà présentes dans
       Linux 1.0 (quoiqu'avec des noms différents), la dernière a été ajoutée dans Linux 2.4. La  même  remarque
       s'applique à fstat() et lstat().

       Les  versions  internes  du  noyau  de  la  structure  stat traitées par les différentes versions étaient
       respectivement :

       __old_kernel_stat
              La structure d'origine avec des champs plutôt étroits et pas de remplissage.

       stat   Un champ plus grand st_ino et le remplissage ont  été  ajoutés  dans  différentes  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 à
              l'extension à 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 étaient finalement consommés dans
              Linux 2.6 avec l'introduction d'ID de périphérique 32 bits et des composants en nanosecondes  dans
              les champs d'horodatage.)

       La fonction d'enveloppe stat() de la glibc dissimule ces détails aux applications invoquant la version la
       plus récente de l'appel système fourni par le noyau, et recompresse l'information renvoyée si  nécessaire
       pour les binaires anciens.

       Dans  les systèmes modernes 64 bits, la vie est plus simple : il n'y a qu'un seul appel système stat() et
       le noyau s'occupe de la structure stat qui contient des champs d'une taille suffisante.

       L'appel système sous-jacent employé 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 sélectionnés dans la structure stat
       renvoyée.

       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <sys/sysmacros.h>
       #include <time.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Utilisation : %s <chemin>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           printf("ID du périphérique 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("périphérique caractère\n");        break;
           case S_IFDIR:  printf("répertoire\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("Numéro d'inœud :            %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("Propriétaires :                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 alloués :         %jd\n",
                  (intmax_t) sb.st_blocks);

           printf("Dernier changement d'état :       %s", ctime(&sb.st_ctime));
           printf("Dernier accès au fichier :         %s", ctime(&sb.st_atime));
           printf("Dernière 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   française   de   cette   page   de   manuel   a   été   créée   par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,   Stéphan   Rafin   <stephan.rafin@laposte.net>,   Thierry   Vignaud
       <tvignaud@mandriva.com>,  François  Micaux,  Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
       <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-luc.coulon@wanadoo.fr>,   Julien   Cristau
       <jcristau@debian.org>,      Thomas      Huriaux      <thomas.huriaux@gmail.com>,     Nicolas     François
       <nicolas.francois@centraliens.net>,    Florentin    Duneau    <fduneau@gmail.com>,     Simon     Paillard
       <simon.paillard@resel.enst-bretagne.fr>,     Denis    Barbier    <barbier@debian.org>,    David    Prévot
       <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à la  GNU  General  Public  License
       version 3   ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   concernant   les  conditions  de  copie  et  de
       distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel,  veuillez  envoyer  un  message  à
       ⟨debian-l10n-french@lists.debian.org⟩.