Provided by: manpages-fr-dev_4.21.0-2_all 

NOM
stat, fstat, lstat, fstatat - Obtenir l'état d'un fichier (file status)
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <sys/stat.h>
int stat(const char *restrict chemin,
struct stat *restrict statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *restrict chemin,
struct stat *restrict statbuf);
#include <fcntl.h> /* Définition des constantes AT_* */
#include <sys/stat.h>
int fstatat(int dirfd, const char *restrict chemin,
struct stat *restrict statbuf, int attributs);
Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :
lstat() :
/* Depuis la glibc 2.20 */ _DEFAULT_SOURCE
|| _XOPEN_SOURCE >= 500
|| /* Depuis la glibc 2.10 : */ _POSIX_C_SOURCE >= 200112L
|| /* Pour la glibc antérieure et égale à 2.19 */ _BSD_SOURCE
fstatat() :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_ATFILE_SOURCE
DESCRIPTION
Ces fonctions renvoient des renseignements sur le fichier indiqué, dans le tampon pointé par statbuf.
Vous n'avez besoin d'aucun droit d'accès au fichier pour obtenir les informations, mais vous devez — dans
le cas de stat(), fstatat() et lstat() — avoir le droit d'exécuter (search) sur tous les répertoires
mentionnés dans le chemin menant au fichier.
stat() et fstatat() récupèrent des renseignements sur le fichier pointé par chemin. Les différences de
fstatat() sont décrites ci-dessous :
lstat() est identique à stat(), sauf que dans le cas où chemin est un lien symbolique, auquel cas il
renvoie des renseignements sur le lien lui-même plutôt que celui du fichier visé.
fstat() est identique à stat(), sauf que le fichier dont les renseignements sont à récupérer est
référencé par le descripteur de fichier fd.
La structure stat
Les trois fonctions renvoient une structure stat (consultez stat(3type)).
Note : pour des raisons de performance et de simplicité, différents champs dans la structure stat peuvent
contenir des informations d'état à différents moments durant l'exécution de l'appel système. Par exemple,
si st_mode ou st_uid sont modifiés par un autre processus en appelant chmod(2) ou chown(2), stat() peut
renvoyer l'ancien st_mode en même temps que le nouveau st_uid ou l'ancien st_uid en même temps que le
nouveau st_mode.
fstatat()
L'appel système fstatat() est une interface plus générale pour accéder à des informations de fichier qui
peut encore fournir exactement le comportement de chaque appel à stat(), lstat() et fstat().
Si le chemin donnée dans chemin est un chemin relatif, il est interprété par rapport au répertoire
référencé par le descripteur de fichier dirfd, (plutôt que par rapport au répertoire courant du processus
appelant, comme avec stat() et lstat() pour un chemin relatif).
Si chemin est relatif, et si dirfd est la valeur spéciale AT_FDCWD, chemin est interprété comme étant
relatif au répertoire courant du processus appelant, comme stat() et lstat().
Si pathname est absolu, alors dirfd est ignoré.
L'argument attributs est soit 0, soit un OU binaire « | » avec les options suivantes :
AT_EMPTY_PATH (depuis Linux 2.6.39)
Si chemin est une chaîne vide, opérer sur le fichier référencé par dirfd (qui peut avoir été
obtenu en utilisant open(2) avec l’attribut O_PATH). Dans ce cas, dirfd peut référencer tout type
de fichier, pas uniquement un répertoire et le comportement de fstatat() est similaire à celui de
fstat(). Si dirfd est AT_FDCWD, l’appel opère sur le répertoire de travail actuel. Cet attribut
est spécifique à Linux, _GNU_SOURCE doit être définie pour obtenir sa définition.
AT_NO_AUTOMOUNT (depuis Linux 2.6.38)
Ne pas monter automatiquement la partie terminal (« basename ») de chemin. Depuis Linux 3.1, cet
attribut est ignoré. Depuis Linux 4.11, cet attribut est implicite.
AT_SYMLINK_NOFOLLOW
Si chemin est un lien symbolique, ne pas le déréférencer, mais renvoyer des informations sur le
lien lui‐même, comme le fait lstat(2). (Par défaut, fstatat() déréférence les liens symboliques,
comme stat(2).)
Consultez openat(2) pour une explication de la nécessité de fstatat().
VALEUR RENVOYÉE
En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno est définie pour préciser
l'erreur.
ERREURS
EACCES La permission de parcours est refusée pour un des répertoires contenu dans le chemin chemin.
(Consultez aussi path_resolution(7).)
EBADF Le descripteur de fichier fd est non valable.
EBADF (fstatat()) chemin est relatif mais dirfd n'est ni AT_FDCWD ni un descripteur de fichier valable.
EFAULT Un pointeur se trouve en dehors de l'espace d'adressage.
EINVAL (fstatat()) attributs contient un attribut non valable.
ELOOP Trop de liens symboliques rencontrés dans le chemin d'accès.
ENAMETOOLONG
nom_chemin est trop long.
ENOENT Un composant du chemin d'accès chemin n'existe pas ou est un lien symbolique pointant nulle part.
ENOENT chemin est une chaîne vide et AT_EMPTY_PATH n'a pas été spécifié dans attributs.
ENOMEM Pas assez de mémoire (c'est-à-dire, mémoire du noyau).
ENOTDIR
Un élément du préfixe de chemin n'est pas un répertoire.
ENOTDIR
(fstatat()) chemin est relatif et dirfd est un descripteur de fichier faisant référence à un
fichier qui n'est pas un dossier.
EOVERFLOW
chemin ou fd font référence à un fichier dont la taille, l'inœud ou le nombre de blocs ne peut pas
être représenté respectivement avec le type off_t, ino_t ou blkcnt_t. Cela peut arriver par
exemple quand une application compilée sans l'option -D_FILE_OFFSET_BITS=64 sur une plate-forme
32 bits appelle stat() pour un fichier dont la taille est supérieure à (1<<31)-1 octets.
VERSIONS
fstatat() a été ajouté dans Linux 2.6.16 ; la prise en charge de la bibliothèque a été ajoutée dans la
glibc 2.4.
STANDARDS
stat(), fstat(), lstat() : SVr4, 4.3BSD, POSIX.1-2001, POSIX.1.2008.
fstatat() : POSIX.1-2008.
D'après POSIX.1-2001, lstat() sur un lien symbolique ne doit renvoyer des informations valables que dans
le champ st_size et le type de fichier du champ st_mode de la structure stat. POSIX.1-2008 renforce la
spécification, obligeant lstat() à renvoyer des informations valables dans tous les champs à part les
bits de mode dans st_mode.
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).
NOTES
Différences entre bibliothèque C et noyau
Avec le temps, l'augmentation de la taille de la structure stat a conduit à trois versions successives de
stat() : sys_stat() (slot __NR_oldstat), sys_newstat() (slot __NR_stat) et sys_stat64() __NR_stat64) sur
les plateformes 32 bits telles que i386. Les deux premières versions étaient déjà présentes dans
Linux 1.0 (quoiqu'avec des noms différents), la dernière a été ajoutée dans Linux 2.4. La même remarque
s'applique à fstat() et lstat().
Les versions internes du noyau de la structure stat traitées par les différentes versions étaient
respectivement :
__old_kernel_stat
La structure d'origine avec des champs plutôt étroits et pas de remplissage.
stat Un champ plus grand st_ino et le remplissage ont été ajoutés dans différentes parties de la
structure pour autoriser un agrandissement futur.
stat64 Un champ st_ino encore plus grand, des champs st_uid et st_gid plus grands pour s'adapter à
l'extension à 32 bits des UID et GID dans Linux 2.4 et d'autres champs agrandis ainsi que plus de
remplissage dans la structure. (Divers octets de remplissage étaient finalement consommés dans
Linux 2.6 avec l'introduction d'ID de périphérique 32 bits et des composants en nanosecondes dans
les champs d'horodatage.)
La fonction d'enveloppe stat() de la glibc dissimule ces détails aux applications invoquant la version la
plus récente de l'appel système fourni par le noyau, et recompresse l'information renvoyée si nécessaire
pour les binaires anciens.
Dans les systèmes modernes 64 bits, la vie est plus simple : il n'y a qu'un seul appel système stat() et
le noyau s'occupe de la structure stat qui contient des champs d'une taille suffisante.
L'appel système sous-jacent employé par la fonction d'enveloppe fstatat() de la glibc s'appelle en fait
fstatat64() ou, sur certaines architectures, newfstatat().
EXEMPLES
Le programme suivant appelle lstat() et affiche certains champs sélectionnés dans la structure stat
renvoyée.
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <time.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 (lstat(argv[1], &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
printf("ID du périphérique contenant : [%x,%x]\n",
major(sb.st_dev),
minor(sb.st_dev));
printf("Type de fichier : ");
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("périphérique bloc\n"); break;
case S_IFCHR: printf("périphérique 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 : %ju\n", (uintmax_t) sb.st_ino);
printf("Mode : %jo (octal)\n",
(uintmax_t) sb.st_mode);
printf("Nombre de liens : %ju\n", (uintmax_t) sb.st_nlink);
printf("Propriétaires : UID=%ju GID=%ju\n",
(uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);
printf("Taille de bloc d'E/S : %jd octets\n",
(intmax_t) sb.st_blksize);
printf("Taille du fichier : %jd octets\n",
(intmax_t) sb.st_size);
printf("Blocs alloués : %jd\n",
(intmax_t) 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);
}
VOIR AUSSI
ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), statx(2), utime(2), stat(3type),
capabilities(7), inode(7), symlink(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess
<https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
<tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
<fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
<nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
<simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
<david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
debian-l10n-french@lists.debian.org.
Pages du manuel de Linux 6.03 5 février 2023 stat(2)