int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
Exigences de macros de test de fonctionnalités pour la glibc (voir feature_test_macros(7)) :
lstat() : _BSD_SOURCE || _XOPEN_SOURCE >= 500
Ces fonctions renvoient des informations à propos d'un fichier. Aucune permission n'est nécessaire sur le fichier lui-même, mais vous devez --- dans le cas de stat() et lstat() --- avoir la permission d'exécution (parcours) pour tous les répertoires de path qui mènent au fichier.
stat() récupère l'état du fichier pointé par path et remplit le tampon buf.
lstat() est identique à stat(), sauf que si path est un lien symbolique, il donne l'état du lien lui-même plutôt que celui du fichier visé.
fstat() est identique à stat(), sauf que le fichier ouvert est pointé par le descripteur fd, obtenu avec open(2).
Les trois fonctions retournent une structure stat contenant les champs suivants :
struct stat { dev_t st_dev; /* ID du périphérique contenant le fichier */ ino_t st_ino; /* Numéro inœud */ 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; /* ID périphérique (si fichier spécial) */ off_t st_size; /* Taille totale en octets */ blksize_t st_blksize; /* Taille de bloc pour E/S */ blkcnt_t 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 état */ };
Le champ st_dev indique le périphérique sur lequel réside le fichier. Le champ st_rdev indique le périphérique que ce fichier (inœud) représente. Le champ st_size indique la taille du fichier (s'il s'agit d'un fichier régulier ou d'un lien symbolique) en octets. La taille d'un lien symbolique est la longueur de la chaîne représentant le chemin d'accès qu'il vise, sans l'octet nul final.
Le champ st_blocks indique le nombre de blocs de 512 octets alloués au fichier (cette valeur peut être inférieure à st_size/512 si le fichier contient des trous). Le champ st_blksize indique la taille de bloc « préférée » pour les entrées-sorties du système de fichiers (l'écriture dans un fichier par petits morceaux peut induire de nombreuses étapes lecture-modification-écriture peu efficaces).
Tous les systèmes de fichiers de Linux n'implémentent pas tous les champs liés à la date. Certains systèmes de fichiers autorisent le montage de telle manière que les accès ne modifient pas le champ st_atime (voir l'option « noatime » de mount(8)).
Le champ st_atime est modifié par les accès au fichier, c'est-à-dire avec execve(2), mknod(2), pipe(2), utime(2) et read(2) (d'au moins un octet). D'autres routines, comme mmap(2), peuvent ou non mettre à jour ce champ st_atime.
Le champ st_mtime est modifié par des changements sur le fichier lui-même, c'est-à-dire mknod(2), truncate(2), utime(2) et write(2) (d'au moins un octet). D'autre part, le champ st_mtime d'un répertoire est modifié lors de la création ou la suppression de fichiers en son sein. Le champ st_mtime n'est pas mis à jour lors de modification de propriétaire, groupe, mode ou nombre de liens physiques.
Le champ st_ctime est modifié lors d'une écriture ou une modification de données concernant l'inœud (propriétaire, groupe, mode, etc.).
Les macros POSIX suivantes sont fournies pour vérifier le type de fichier en utilisant le champ stmode :
Les attributs suivants correspondent au champ st_mode :
S_IFMT | 0170000 | masque du type de fichier |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | lien symbolique |
S_IFREG | 0100000 | fichier ordinaire |
S_IFBLK | 0060000 | périphérique blocs |
S_IFDIR | 0040000 | répertoire |
S_IFCHR | 0020000 | périphérique caractères |
S_IFIFO | 0010000 | fifo |
S_ISUID | 0004000 | bit set-UID |
S_ISGID | 0002000 | bit set-GID (voir plus loin) |
S_ISVTX | 0001000 | bit « sticky » (voir plus loin) |
S_IRWXU | 00700 | lecture/écriture/exécution du propriétaire |
S_IRUSR | 00400 | le propriétaire a le droit de lecture |
S_IWUSR | 00200 | le propriétaire a le droit d'écriture |
S_IXUSR | 00100 | le propriétaire a le droit d'exécution |
S_IRWXG | 00070 | 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 | 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 |
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.
POSIX ne décrit pas les bits S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, mais réclame d'utiliser les macros S_ISDIR(), etc. Les macros S_ISLNK() et S_ISSOCK() ne se trouvent pas dans POSIX.1-1996 mais sont présentes dans POSIX.1-2001. La première vient de SVID 4, la seconde de SUSv2.
Unix V7 (et les systèmes suivants) propose S_IREAD, S_IWRITE, S_IEXEC, là où POSIX préfère leurs synonymes S_IRUSR, S_IWUSR, S_IXUSR.
hex | nom | ls | octal | description |
f000 | S_IFMT | 170000 | Masque du type de fichier | |
0000 | 000000 | inœud hors service (SCO) ; type BSD | ||
inconnu ; SVID-v2 et XPG2 ont 0 | ||||
et 0100000 pour un fichier ordinaire | ||||
1000 | S_IFIFO | p| | 010000 | FIFO (tube nommé) |
2000 | S_IFCHR | c | 020000 | fichier spécial caractère (V7) |
3000 | S_IFMPC | 030000 | fichier spécial caractère multiplexé (V7) | |
4000 | S_IFDIR | d/ | 040000 | répertoire (V7) |
5000 | S_IFNAM | 050000 | fichier spécial nommé XENIX avec deux | |
sous-types distingués par | ||||
st_rdev valant 1 ou 2 | ||||
0001 | S_INSEM | s | 000001 | sous-type sémaphore de IFNAM XENIX |
0002 | S_INSHD | m | 000002 | sous-type données partagées de IFNAM XENIX |
6000 | S_IFBLK | b | 060000 | fichier spécial bloc (V7) |
7000 | S_IFMPB | 070000 | fichier spécial bloc multiplexé (V7) | |
8000 | S_IFREG | - | 100000 | fichier normal (V7) |
9000 | S_IFCMP | 110000 | compressé VxFS | |
9000 | S_IFNWK | n | 110000 | fichier spécial réseau (HP-UX) |
a000 | S_IFLNK | l@ | 120000 | lien symbolique (BSD) |
b000 | S_IFSHAD | 130000 | Fichier shadow Solaris pour l'ACL | |
(invisible depuis l'espace utilisateur) | ||||
c000 | S_IFSOCK | s= | 140000 | socket (BSD; aussi "S_IFSOC" sur VxFS) |
d000 | S_IFDOOR | D> | 150000 | Solaris door |
e000 | S_IFWHT | w% | 160000 | BSD whiteout (non utilisé pour les inœuds) |
0200 | S_ISVTX | 001000 | « sticky bit » : garder en mémoire après | |
exécution (V7) réservé (SVID-v2) | ||||
non-répertoires : ne pas swapper | ||||
le fichier (SunOS) | ||||
répertoires : attributs de restrictions | ||||
d'effacement (SVID-v4.2) | ||||
0400 | S_ISGID | 002000 | Utiliser le GID à l'exécution (V7) | |
pour les répertoires : sémantique | ||||
BSD propageant le GID | ||||
0400 | S_ENFMT | 002000 | Verrouillage strict System V | |
(partagé avec S_ISGID) | ||||
0800 | S_ISUID | 004000 | Utiliser l'UID à l'exécution (V7) | |
0800 | S_CDF | 004000 | Le répertoire est un fichier dépendant | |
du contexte (HP-UX) |
Pour la plupart des fichiers du répertoire /proc, stat() ne renvoie pas la taille du fichier dans le champ st_size ; à la place, le champ contient la valeur 0.
#include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct stat sb; if (argc != 2) { fprintf(stderr, "Usage: %s <pathname>\n", argv[0]); exit(EXIT_FAILURE); } if (stat(argv[1], &sb) == -1) { perror("stat"); exit(EXIT_SUCCESS); } printf("Type de fichier : "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("périphérique de bloc\n"); break; case S_IFCHR: printf("périphérique de 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 : %ld\n", (long) sb.st_ino); printf("Mode : %lo (octal)\n", (unsigned long) sb.st_mode); printf("Nombre de liens : %ld\n", (long) sb.st_nlink); printf("Propriétaires : UID=%ld GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid); printf("Taille de bloc d’E/S : %ld octets\n", (long) sb.st_blksize); printf("Taille du fichier : %lld octets\n", (long long) sb.st_size); printf("Blocs alloués : %lld\n", (long long) 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); }
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 15 octobre 1996 et révisée le 2 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 stat ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 2 juillet 2008