Provided by:
manpages-fr-dev_3.32d0.2p4-1_all 
NOM
stat, fstat, lstat - Obtenir l'etat d'un fichier (file status)
SYNOPSIS
#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 fonctionnalites pour la glibc (consultez
feature_test_macros(7)) :
lstat() :
_BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* Depuis la glibc 2.10 : */ _POSIX_C_SOURCE >= 200112L
DESCRIPTION
Ces fonctions renvoient des informations a propos du fichier indique.
Vous n'avez besoin d'aucun droit d'acces au fichier pour obtenir les
informations, mais vous devez -- dans le cas de stat() et lstat() --
avoir le droit de parcours de tous les repertoires mentionnes dans le
chemin menant au fichier.
stat() recupere l'etat du fichier pointe par path et remplit le tampon
buf.
lstat() est identique a stat(), sauf que dans le cas ou path est un
lien symbolique, il donne l'etat du lien lui-meme plutot que celui du
fichier vise.
fstat() est identique a stat(), sauf que le fichier dont l'etat est
donne est celui reference par le descripteur de fichier fd.
Les trois fonctions retournent une structure stat contenant les champs
suivants :
struct stat {
dev_t st_dev; /* Peripherique */
ino_t st_ino; /* Numero inoeud */
mode_t st_mode; /* Protection */
nlink_t st_nlink; /* Nb liens materiels */
uid_t st_uid; /* UID proprietaire */
gid_t st_gid; /* GID proprietaire */
dev_t st_rdev; /* Type peripherique */
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 de 512B alloues */
time_t st_atime; /* Heure dernier acces */
time_t st_mtime; /* Heure derniere modification */
time_t st_ctime; /* Heure dernier changement etat */
};
Le champ st_dev decrit le peripherique sur lequel ce fichier reside.
Les macros major(3) et minor(3) peuvent etre utiles pour decomposer
l'identifiant de peripherique de ce champ.
Le champ st_rdev indique le peripherique que ce fichier (inoeud)
represente.
Le champ st_size indique la taille du fichier (s'il s'agit d'un fichier
ordinaire ou d'un lien symbolique) en octets. La taille d'un lien
symbolique est la longueur de la chaine representant le chemin d'acces
qu'il vise, sans le caractere NUL final.
Le champ st_blocks indique le nombre de blocs de 512 octets alloues au
fichier. Cette valeur peut etre inferieure a st_size/512 si le fichier
a des trous.
Le champ st_blksize donne la taille de bloc << preferee >> pour des
entrees-sorties efficaces. Des ecritures par blocs plus petits peuvent
entrainer un cycle lecture/modification/reecriture inefficace.
Tous les systemes de fichiers de Linux n'implementent pas tous les
champs lies a la date. Certains systemes de fichiers autorisent le
montage de telle maniere que les acces a des fichiers et/ou repertoires
ne modifient pas le champ st_atime (voir les options noatime,
nodiratime et relatime de mount(8) ainsi que les informations
correspondante dans mount(2)). De plus, st_atime n'est pas mis a jour
si un fichier est ouvert avec l'option O_NOATIME ; consultez open(2).
Le champ st_atime est modifie par les acces 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 a jour
ce champ st_atime.
Le champ st_mtime est modifie par des changements sur le fichier
lui-meme, c'est-a-dire mknod(2), truncate(2), utime(2) et write(2)
(d'au moins un octet). D'autre part, le champ st_mtime d'un repertoire
est modifie lors de la creation ou la suppression de fichiers en son
sein. Le champ st_mtime n'est pas mis a jour lors de modification de
proprietaire, groupe, mode ou nombre de liens physiques.
Le champ st_ctime est modifie lors d'une ecriture ou une modification
de donnees concernant l'inoeud (proprietaire, groupe, mode, etc.).
Les macros POSIX suivantes sont fournies pour verifier le type de
fichier (dans le champ st_mode) :
S_ISREG(m) un fichier ordinaire ?
S_ISDIR(m) un repertoire ?
S_ISCHR(m) un peripherique caractere ?
S_ISBLK(m) un peripherique bloc ?
S_ISFIFO(m) FIFO (tube nomme) ?
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 peripherique bloc
S_IFDIR 0040000 repertoire
S_IFCHR 0020000 peripherique caractere
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/ecriture/execution du proprietaire
S_IRUSR 00400 le proprietaire a le droit de lecture
S_IWUSR 00200 le proprietaire a le droit d'ecriture
S_IXUSR 00100 le proprietaire a le droit d'execution
S_IRWXG 00070 lecture/ecriture/execution du groupe
S_IRGRP 00040 le groupe a le droit de lecture
S_IWGRP 00020 le groupe a le droit d'ecriture
S_IXGRP 00010 le groupe a le droit d'execution
S_IRWXO 00007 lecture/ecriture/execution des autres
S_IROTH 00004 les autres ont le droit de lecture
S_IWOTH 00002 les autres ont le droit d'ecriture
S_IXOTH 00001 les autres ont le droit d'execution
Le bit Set-GID (S_ISGID) a plusieurs utilisations particulieres : pour
un repertoire, il indique que la semantique BSD doit etre appliquee en
son sein, c'est-a-dire que les fichiers qui y sont crees heritent leur
GID du repertoire et non pas du GID effectif du processus createur, et
les sous-repertoires auront automatiquement le bit S_ISGID actif. Pour
les fichiers qui n'ont pas d'autorisation d'execution 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 repertoire indique que les
fichiers qui s'y trouvent ne peuvent etre renommes ou effaces que par
leur proprietaire, par le proprietaire du repertoire ou par un
processus privilegie.
VALEUR RENVOY'EE
S'il reussit, cet appel systeme renvoie 0. S'il echoue, il renvoie -1
et remplit errno en consequence.
ERREURS
EACCES La permission de parcours est refusee pour un des repertoires
contenu dans le chemin path. (Consultez 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 rencontres dans le chemin d'acces.
ENAMETOOLONG
Nom de fichier trop long.
ENOENT Un composant du chemin path n'existe pas, ou path est une chaine
vide.
ENOMEM Pas assez de memoire (memoire noyau).
ENOTDIR
Un element du prefixe du chemin path n'est pas un repertoire.
EOVERFLOW
(stat()) path se refere a un fichier dont la taille ne peut pas
etre representee avec le type off_t. Ceci peut arriver 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 bits.
CONFORMIT'E
Ces appels systeme sont conformes a SVr4, BSD 4.3, POSIX.1-2001.
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). Si vous avez besoin de connaitre la definition des types blkcnt_t
ou blksize_t de <sys/stat.h>, alors definissez _XOPEN_SOURCE avec une
valeur superieure ou egale a 500 (avant d'inclure tout en-tete).
POSIX ne decrit pas les bits S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG,
S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, mais reclame d'utiliser
les macros S_ISDIR(), etc. Les macros S_ISLNK() et S_ISSOCK() ne se
trouvent pas dans POSIX.1-1996 mais sont presentes dans POSIX.1-2001.
La premiere vient de SVID 4, la seconde de SUSv2.
UNIX V7 (et les systemes suivants) propose S_IREAD, S_IWRITE, S_IEXEC,
la ou POSIX prefere leurs synonymes S_IRUSR, S_IWUSR, S_IXUSR.
Autres syst`emes
Voici quelques valeurs qui ont ete (ou sont) utilisees sur d'autres
systemes
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 nomme)
2000 S_IFCHR c 020000 fichier special caractere (V7)
3000 S_IFMPC 030000 fichier special caractere multiplexe
(V7)
4000 S_IFDIR d/ 040000 repertoire (V7)
5000 S_IFNAM 050000 fichier special nomme XENIX avec deux
sous-types distingues par
st_rdev valant 1 ou 2
0001 S_INSEM s 000001 sous-type semaphore de IFNAM XENIX
0002 S_INSHD m 000002 sous-type donnees partagees de IFNAM
XENIX
6000 S_IFBLK b 060000 fichier special bloc (V7)
7000 S_IFMPB 070000 fichier special bloc multiplexe (V7)
8000 S_IFREG - 100000 fichier normal (V7)
9000 S_IFCMP 110000 compresse VxFS
9000 S_IFNWK n 110000 fichier special reseau (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 utilise pour les
inoeuds)
0200 S_ISVTX 001000 << sticky bit >>: garder en memoire
apres execution (V7)
reserve (SVID-v2)
non-repertoires : ne pas swapper le
fichier (SunOS)
repertoires : attribut de restrictions
d'effacement (SVID-v4.2)
0400 S_ISGID 002000 Fixer le GID a l'execution (V7)
pour les repertoires : semantique BSD
pour la propagation du GID
0400 S_ENFMT 002000 Verrouillage strict System V
(partage avec S_ISGID)
0800 S_ISUID 004000 Fixer l'UID a l'execution (V7)
0800 S_CDF 004000 Le repertoire est un fichier
dependant du contexte (HP-UX)
Une commande sticky est apparue dans la version 32V d'AT&T UNIX.
NOTES
Depuis le noyau 2.5.48, la structure stat propose une resolution 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 definie. Ces champs
sont definis dans POSIX.1-2008 et, a partir de la version 2.12, la
glibc expose aussi ces noms de champs si _POSIX_C_SOURCE est definie
avec une valeur superieure ou egale a 200809L ou si _XOPEN_SOURCE est
definie avec une valeur superieure ou egale a 700. Si aucune de ces
macros ne sont definies, alors les valeurs en nanosecondes sont
exposees avec des noms de la forme st_atimensec. Sur les systemes de
fichiers qui ne gerent pas les resolutions inferieures a la seconde,
ces champs prennent la valeur 0.
Sous Linux, lstat() ne provoque generalement pas d'action de
l'<< automonteur >>, tandis que stat() le fera.
Pour la plupart des fichiers sous /proc, stat() ne renvoie pas la
taille du fichier dans le champ st_size. La valeur 0 est placee dans ce
champ.
Interface noyau sous-jacente
Avec le temps, l'augmentation de la taille de la structure stat a
conduit a 3 versions successives de stat() : sys_stat() (entree
__NR_oldstat), sys_newstat() (entree __NR_stat) et sys_stat64()
(nouveaute du noyau 2.4 ; entree __NR_stat64). La fonction stat()
fournie par la glibc cache ces details aux applications, en appelant la
version la plus recente de l'appel systeme fournie par le noyau et en
reorganisant si necessaire les informations renvoyees pour les anciens
binaires. La meme remarque s'applique a fstat() et lstat().
EXEMPLE
Le programme suivant appelle stat() et affiche certains champs
selectionnes dans la structure stat renvoyee.
#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_FAILURE);
}
printf("Type de fichier : ");
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("peripherique bloc\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 : %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("Proprietaires : 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 alloues : %lld\n",
(long long) 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
access(2), chmod(2), chown(2), fstatat(2), readlink(2), utime(2),
capabilities(7), symlink(7)
COLOPHON
Cette page fait partie de la publication 3.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.
Linux 3 decembre 2010 STAT(2)