STAT(2) Manuel du programmeur Linux STAT(2)
stat, fstat, lstat - Obtenir l'tat d'un fichier (file status)
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
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 fonctionnalits pour la glibc (voir fea-
ture_test_macros(7)) :
lstat() : _BSD_SOURCE || _XOPEN_SOURCE >= 500
Ces fonctions renvoient des informations propos du fichier indiqu.
Vous n'avez besoin d'aucun droit d'accs au fichier pour obtenir les
informations, mais vous devez -- dans le cas de stat() et lstat() --
avoir le droit de parcours de tous les rpertoires mentionns dans le
chemin menant au fichier.
stat() rcupre l'tat du fichier point par path et remplit le tampon buf.
lstat() est identique stat(), sauf que dans le cas o path est un lien
symbolique, il donne l'tat du lien lui-mme plutt que celui du fichier
vis.
fstat() est identique stat(), sauf que le fichier dont l'tat est donn
est celui rfrenc par le descripteur de fichier fd.
Les trois fonctions retournent une structure stat contenant les champs
suivants :
struct stat {
dev_t st_dev; /* Priphrique */
ino_t st_ino; /* Numro i-noeud */
mode_t st_mode; /* Protection */
nlink_t st_nlink; /* Nb liens matriels */
uid_t st_uid; /* UID propritaire */
gid_t st_gid; /* GID propritaire */
dev_t st_rdev; /* Type priphrique */
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 allous */
time_t st_atime; /* Heure dernier accs */
time_t st_mtime; /* Heure dernire modification */
time_t st_ctime; /* Heure dernier changement tat */
};
Le champ st_dev indique le priphrique sur lequel ce fichier se trouve.
Le champ st_rdev indique le priphrique que ce fichier (inoeud)
reprsente.
Le champ st_size indique la taille du fichier (s'il s'agit d'un fichier
rgulier ou d'un lien symbolique) en octets. La taille d'un lien symbol-
ique est la longueur de la chane reprsentant le chemin d'accs qu'il
vise, sans le caractre NUL final.
Le champ st_blocks indique le nombre de blocs de 512 octets allous au
fichier. Cette valeur peut tre infrieure st_size/512 si le fichier a
des trous.
Le champ st_blksize donne la taille de bloc prfre pour des
entres-sorties efficaces. Des critures par blocs plus petits peuvent
entraner un cycle lecture/modification/rcriture inefficace.
Tous les systmes de fichiers de Linux n'implmentent pas tous les champs
lis la date. Certains systmes de fichiers autorisent le montage de
telle manire que les accs ne modifient pas le champ st_atime (voir
l'option noatime de mount(8)).
Le champ st_atime est modifi par les accs au fichier, par exemple 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-mme, 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 rpertoire est
modifi lors de la cration ou la suppression de fichiers en son sein. Le
champ st_mtime n'est pas mis jour lors de modification de propritaire,
groupe, mode ou nombre de liens physiques.
Le champ st_ctime est modifi lors d'une criture ou une modification de
donnes concernant l'inoeud (propritaire, groupe, mode, etc.).
Les macros POSIX suivantes sont fournies pour vrifier le type de
fichier (dans le champ st_mode) :
S_ISREG(m) un fichier ordinaire ?
S_ISDIR(m) un rpertoire ?
S_ISCHR(m) un priphrique en mode caractre ?
S_ISBLK(m) un priphrique en mode bloc ?
S_ISFIFO(m) FIFO (tube nomm) ?
S_ISLNK(m) un lien symbolique ? (Pas dans POSIX.1-1996).
S_ISSOCK(m) une socket ? (Pas dans POSIX.1-1996).
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 priphrique blocs
S_IFDIR 0040000 rpertoire
S_IFCHR 0020000 priphrique caractres
S_IFIFO 0010000 fifo
S_ISUID 0004000 bit Set-UID
S_ISGID 0002000 bit Set-Gid (voir ci-dessous)
S_ISVTX 0001000 bit sticky (voir ci-dessous)
S_IRWXU 00700 lecture/criture/excution du propritaire
S_IRUSR 00400 le propritaire a le droit de lecture
S_IWUSR 00200 le propritaire a le droit d'criture
S_IXUSR 00100 le propritaire a le droit d'excution
S_IRWXG 00070 lecture/criture/excution 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'excution
S_IRWXO 00007 lecture/criture/excution 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'excution
Le bit Set-GID (S_ISGID) a plusieurs utilisations particulires : pour
un rpertoire, il indique que la smantique BSD doit tre applique en son
sein, c'est--dire que les fichiers qui y sont crs hritent leur GID du
rpertoire et non pas du GID effectif du processus crateur, et les
sous-rpertoires auront automatiquement le bit S_ISGID actif. Pour les
fichiers qui n'ont pas d'autorisation d'excution pour le groupe
(S_IXGRP non actif), ce bit indique qu'un verrouillage strict est en
vigueur sur ce fichier.
Le bit sticky (S_ISVTX) sur un rpertoire indique que les fichiers qui
s'y trouvent ne peuvent tre renomms ou effacs que par leur propritaire,
par le propritaire du rpertoire ou par un processus privilgi.
En cas de russite, zro est renvoy, sinon -1 est renvoy et errno con-
tient le code d'erreur.
EACCES La permission de parcours est refuse pour un des rpertoires con-
tenu dans le chemin path. (Voir aussi path_resolution(7).)
EBADF fd est un mauvais descripteur.
EFAULT Un pointeur se trouve en dehors de l'espace d'adressage.
ELOOP Trop de liens symboliques rencontrs dans le chemin d'accs.
ENAMETOOLONG
Nom de fichier trop long.
ENOENT Un composant du chemin path n'existe pas, ou il s'agit d'une
chane vide.
ENOMEM Pas assez de mmoire (mmoire noyau).
ENOTDIR
Un lment du chemin d'accs n'est pas un rpertoire.
Ces appels systme sont conformes SVr4, BSD 4.3, POSIX.1-2001.
L'utilisation des champs st_blocks et st_blksize risque d'tre moins
portable. (Ils ont t introduits dans BSD. Leur interprtation change
suivant les systmes, voire sur un mme systme s'il y a des montages
NFS.)
POSIX ne dcrit pas les bits S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG,
S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, mais rclame d'utiliser les
macros S_ISDIR(), etc. Les macros S_ISLNK() et S_ISSOCK() ne se trou-
vent pas dans POSIX.1-1996 mais sont prsentes dans POSIX.1-2001. La
premire vient de SVID 4, la seconde de SUSv2.
Unix V7 (et les systmes suivants) propose S_IREAD, S_IWRITE, S_IEXEC, l
o POSIX prfre leurs synonymes S_IRUSR, S_IWUSR, S_IXUSR.
Autres systmes
Voici quelques valeurs qui ont t (ou sont) utilises sur d'autres
systmes
hex nom ls octal description
f000 S_IFMT 170000 Masque du type de fichier
0000 000000 inoeud hors-service (SCO) ; type inconnu
(BSD) ; SVID-v2 et XPG2 ont 0 et
0100000 pour fichier ordinaire
1000 S_IFIFO p| 010000 fifo (tube nomm)
2000 S_IFCHR c 020000 fichier spcial caractre (V7)
3000 S_IFMPC 030000 fichier spcial caractre multiplex (V7)
4000 S_IFDIR d/ 040000 rpertoire (V7)
5000 S_IFNAM 050000 fichier spcial nomm XENIX avec deux
sous-types distingus par
st_rdev valant 1 ou 2
0001 S_INSEM s 000001 sous-type smaphore de IFNAM XENIX
0002 S_INSHD m 000002 sous-type donnes partages de IFNAM
XENIX
6000 S_IFBLK b 060000 fichier spcial bloc (V7)
7000 S_IFMPB 070000 fichier spcial bloc multiplex (V7)
8000 S_IFREG - 100000 fichier normal (V7)
9000 S_IFCMP 110000 compress VxFS
9000 S_IFNWK n 110000 fichier spcial rseau (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
inoeuds)
0200 S_ISVTX 001000 sticky bit : garder en mmoire
aprs excution (V7)
rserv (SVID-v2)
non-rpertoires : ne pas swapper le
fichier (SunOS)
rpertoires : attribut de restrictions
d'effacement (SVID-v4.2)
0400 S_ISGID 002000 Fixer le GID l'excution (V7)
pour les rpertoires : smantique BSD
pour la propagation du GID
0400 S_ENFMT 002000 Verrouillage strict SysV
(partag avec S_ISGID)
0800 S_ISUID 004000 Fixer l'UID l'excution (V7)
0800 S_CDF 004000 Le rpertoire est un fichier
dpendant du contexte (HP-UX)
Une commande sticky est apparue dans la version 32V d'AT&T UNIX.
Notes sur Linux
Depuis le noyau 2.5.48, la structure stat propose une rsolution d'une
nanoseconde pour les trois champs d'heure. La glibc montre le composant
en nanosecondes de chaque champ en utilisant des noms de la forme
st_atim.tv_nsec si _BSD_SOURCE ou _SVID_SOURCE est dfini, ou bien
st_atimensec si aucune de ces macros n'est dfinie. Sur les systmes de
fichiers qui ne grent pas les rsolutions infrieures la seconde, ces
champs prennent la valeur 0.
Pour la plupart des fichiers sous /proc, stat() ne renvoie pas la
taille du fichier dans le champ st_size. La valeur 0 est place dans ce
champ.
Interface noyau sous-jacente
Avec le temps, l'augmentation de la taille de la structure stat a con-
duit
3 versions successives de stat() : sys_stat() (entre __NR_oldstat),
sys_newstat() (entre __NR_stat) et sys_stat64() (nouveaut du noyau
2.4 ; entre __NR_stat64). La fonction stat() fournie par la glibc cache
ces dtails aux applications, en appelant la version la plus rcente de
l'appel systme fournie par le noyau et en rorganisant si ncessaire les
informations renvoyes pour les anciens binaires. La mme remarque
s'applique fstat() etlstat().
Le programme suivant appelle stat() et affiche certains champs slec-
tionns dans la structure stat renvoye.
#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("priphrique bloc\n"); break;
case S_IFCHR: printf("priphrique caractre\n"); break;
case S_IFDIR: printf("rpertoire\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("Numro d'inoeud : %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("Propritaires : 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 allous : %lld\n",
(long long) sb.st_blocks);
printf("Dernier changement d'tat : %s", ctime(&sb.st_ctime));
printf("Dernier accs au fichier : %s", ctime(&sb.st_atime));
printf("Dernire modification du fichier : %s", ctime(&sb.st_mtime));
exit(EXIT_SUCCESS);
}
access(2), chmod(2), chown(2), fstatat(2), readlink(2), utime(2), capa-
bilities(7), symlink(7)
Cette page fait partie de la publication 3.07 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent tre trouves l'adresse http://www.ker-
nel.org/doc/man-pages/.
Cette page de manuel a t traduite et mise jour par Christophe Blaess
<http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par Alain
Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006, et mise disposi-
tion sur http://manpagesfr.free.fr/.
Les mises jour et corrections de la version prsente dans Debian sont
directement gres par Julien Cristau <jcristau [AT] debian.org> et l'quipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en crivant
<debian-l10n-french [AT] lists.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accs la version anglaise de ce document en
utilisant la commande man -L C <section> <page_de_man> .
Linux 26 juillet 2007 STAT(2)