STAT(2)            Manuel du programmeur Linux            STAT(2)


NOM
       stat,  fstat, lstat - Obtenir le statut d'un fichier (file
       status).

SYNOPSIS
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *file_name, struct stat *buf);
       int fstat(int filedes, struct stat *buf);
       int lstat(const char *file_name, struct stat *buf);

DESCRIPTION
       Ces fonctions  renvoient  des  informations  à  propos  du
       fichier  indiqué. Vous n'avez besoin d'aucun droit d'accès
       au fichier pour obtenir les informations, mais vous  devez
       avoir  le  droit  de parcours de tous les répertoires men­
       tionnés dans le chemin menant au fichier.

       stat récupère le statut du fichier pointé par file_name et
       remplit le buffer buf.

       lstat  est  identique  à  stat, sauf qu'il donne le statut
       d'un lien lui-même et non pas du  fichier  pointé  par  ce
       lien.

       fstat est identique à stat, sauf que le fichier ouvert est
       pointé par le descripteur filedes, obtenu avec open(3).


       Les trois fonctions retournent  une  structure  stat  con­
       tenant les champs suivants :

              struct stat
              {
                  dev_t         st_dev;      /* Périphérique                */
                  ino_t         st_ino;      /* Numéro i-noeud              */
                  mode_t        st_mode;     /* Protection                  */
                  nlink_t       st_nlink;    /* Nb liens matériels          */
                  uid_t         st_uid;      /* UID propriétaire            */
                  gid_t         st_gid;      /* GID propriétaire            */
                  dev_t         st_rdev;     /* Type périphérique           */
                  off_t         st_size;     /* Taille totale en octets     */
                  unsigned long st_blksize;  /* Taille de bloc pour E/S     */
                  unsigned long st_blocks;   /* Nombre de blocs alloués     */
                  time_t        st_atime;    /* Heure dernier accès         */
                  time_t        st_mtime;    /* Heure dernière modification */
                  time_t        st_ctime;    /* Heure dernier changement    */
              };

       La valeur st_blocks donne la taille du fichier en blocs de
       512 octets.  La valeur st_blksize  indique  la  taille  de
       bloc   "préférée"  pour  les  entrées/sorties  du  système
       (l'écriture dans  un  fichier  par  petits  morceaux  peut



Linux                      18 Mai 1999                          1





STAT(2)            Manuel du programmeur Linux            STAT(2)


       induire de nombreuses étapes lecture-modification-écriture
       peu efficaces).

       Les systèmes de fichiers de Linux n'implémentent pas  tous
       les  champs  "time".  Traditionnellement st_atime est mod­
       ifié par mknod(2), utime(2), read(2), write(2),  et  trun­
       cate(2).

       Généralement  st_mtime est modifié par mknod(2), utime(2),
       et write(2).  mais pas en  cas  de  modification  de  pro­
       priétaire,  de  groupe, de compte de liens physiques ou de
       mode.

       Traditionnellement st_ctime est modifié par une  écriture,
       une  lecture,  ou  une  modification de données concernant
       l'i-noeud (propriétaire, groupe, mode, etc...)

       Les macros POSIX suivantes sont  fournies  pour  manipuler
       les statuts d'un fichier

              S_ISLNK(m)  est-ce un lien symbolique ?

              S_ISREG(m)  un fichier régulier ?

              S_ISDIR(m)  un répertoire ?

              S_ISCHR(m)  un péripherique en mode caractère ?

              S_ISBLK(m)  un périphérique en mode blocs ?

              S_ISFIFO(m) une FIFO ?

              S_ISSOCK(m) une socket ?

       Les attributs suivants correspondent au champ st_mode.

              S_IFMT   00170000  (non POSIX) masque de l'ensemble
                       des bits du type de fichier

              S_IFSOCK 0140000 (non POSIX) socket

              S_IFLNK  0120000 (non POSIX) lien symbolique

              S_IFREG  0100000 (non POSIX) fichier régulier

              S_IFBLK  0060000 (non POSIX) périphérique blocs

              S_IFDIR  0040000 (non POSIX) répertoire

              S_IFCHR  0020000  (non  POSIX)  périphérique   car­
                       actères

              S_IFIFO  0010000 (non POSIX) fifo




Linux                      18 Mai 1999                          2





STAT(2)            Manuel du programmeur Linux            STAT(2)


              S_ISUID  0004000 bit Set-UID

              S_ISGID  0002000 bit Set-Gid

              S_ISVTX  0001000 (non POSIX) bit "sticky"

              S_IRWXU  00700 droits de lecture/écriture/exécution
                       du propriétaire

              S_IRUSR  00400 le propriétaire a le droit  de  lec­
                       ture (comme S_IREAD qui n'est pas POSIX)

              S_IWUSR  00200  le propriétaire a le droit d'écrit­
                       ure (comme S_IWRITE qui n'est pas POSIX)

              S_IXUSR  00100   le   propriétaire   a   le   droit
                       d'exécution  (comme  S_IEXEC qui n'est pas
                       POSIX)

              S_IRWXG  00070 droits de lecture/écriture/exécution
                       du groupe

              S_IRGRP  00040 le groupe a le droit de lecture

              S_IWGRP  00020 le groupe a le droit d'écriture

              S_IXGRP  00010 le groupe a le droit d'exécution

              S_IRWXO  00007 droits de lecture/écriture/exécution
                       des autres

              S_IROTH  00004 les autres ont le droit de lecture

              S_IWOTH  00002 les autres ont le droit d'écriture

              S_IXOTH  00001 les autres ont le droit d'exécution

VALEUR RENVOYÉE
       Ces fonctions retournent zero si  elles  réussissent.   En
       cas  d'echec  -1  est  renvoyé,  et errno contient le code
       d'erreur.

ERREURS
       EBADF   filedes est un mauvais descripteur.

       ENOENT  Un composant de  file_name  n'existe  pas,  ou  il
               s'agit d'une chaine vide.

       ENOTDIR Un composant du chemin d'accès n'est pas un réper­
               toire.

       ELOOP   Trop  de  liens  symboliques  rencontrés  dans  le
               chemin d'accès.




Linux                      18 Mai 1999                          3





STAT(2)            Manuel du programmeur Linux            STAT(2)


       EFAULT  Un  pointeur  se  trouve  en  dehors  de  l'espace
               d'adressage.

       EACCES  Autorisation refusée.

       ENOMEM  Pas assez de mémoire pour le noyau.

       ENAMETOOLONG
               Nom de fichier trop long

EXEMPLE
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int
       main (int nb_args, char * args [])
       {
            struct stat    sts;

            if (nb_args != 2) {
                 fprintf (stderr, "syntaxe : %s <fichier>\n", args [0]);
                 exit (1);
            }

            if ( stat (args [1], & sts) != 0) {
                 fprintf (stderr, "%s : erreur %X\n", args [0], errno);
                 exit (1);
            }

            fprintf (stdout,
                 "Périphérique : %d\n",
                 sts . st_dev);
            fprintf (stdout,
                 "Noeud : %ld\n",
                 sts . st_ino);
            fprintf (stdout,
                 "Protection : %o\n",
                 sts . st_mode);
            fprintf (stdout,
                 "nb liens matériels: %d\n",
                 sts . st_nlink);
            fprintf (stdout,
                 "ID propriétaire : %d\n",
                 sts . st_uid);
            fprintf (stdout,
                 "ID groupe: %d\n",
                 sts . st_gid);
            fprintf (stdout,
                 "Taille : %lu octets\n",
                 sts . st_size);
            fprintf (stdout,
                 "Taille de bloc : %lu\n",



Linux                      18 Mai 1999                          4





STAT(2)            Manuel du programmeur Linux            STAT(2)


                 sts . st_blksize);
            fprintf (stdout,
                 "Nombre de blocs : %lu\n",
                 sts . st_blocks);
       }

CONFORMITÉ
       Les appels stat, etfstat sont conformes aux versions SVr4,
       PPOSIX,  X/OPEN,  BSD 4.3.  L'appel lstat est conforme aux
       versions BSD 4.3 et SVr4.  SVr4 mentionne  des  conditions
       d'erreurs  supplémentaires  pour  lstat EINTR, ENOLINK, et
       EOVERFLOW.  Pour stat, etlstat SVr4 indique les conditions
       supplémentaires  EACCES,  EINTR,  EMULTIHOP,  ENOLINK,  et
       EOVERLOW.  L'utilisation des champs st_blocks  et  st_blk­
       size  risque  d'être moins portable. Ils ont été introduit
       dans BSD, et ne  sont  pas  mentionnée  dans  POSIX.  Leur
       interprétation  change  suivant les systèmes, voire sur un
       même système s'il y a des montages NFS.

VOIR AUSSI
       chmod(2), chown(2), readlink(2), utime(2)


TRADUCTION
       Christophe Blaess, 1997.
































Linux                      18 Mai 1999                          5