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