#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 version 2.10 de la glibc : _POSIX_C_SOURCE >= 200809L Avant la version 2.10 de la glibc : _ATFILE_SOURCE
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.
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.
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 :
Consultez openat(2) pour une explication de la nécessité de fstatat().
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).
Les versions internes du noyau de la structure stat traitées par les différentes versions étaient respectivement :
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().
#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));
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 à