Linux |
CentOS 5.3 |
|
fstat(2) |
stat, fstat, lstat − Obtenir l’état d’un fichier (file status). |
#include <sys/types.h> int stat(const char *path, struct stat
*buf); |
Ces fonctions renvoient des informations à propos d’un fichier. Aucune permission n’est nécessaire sur le fichier lui-même, mais — dans le cas de stat() et lstat() — la permission d’exécution (parcours) est nécessaire pour tous les répertoires de path qui mènent au fichier. stat() récupère l’état du fichier pointé par file_name et remplit le tampon buf. lstat() est identique à stat(), sauf que si path est un lien symbolique, il donne l’état du lien lui-même plutôt que celui du fichier visé. fstat() est identique à stat(), sauf que le fichier ouvert est pointé par le descripteur filedes, obtenu avec open(2). Les trois fonctions retournent une structure stat contenant les champs suivants : |
struct stat { dev_t st_dev; /* ID du périphérique contenant le fichier */ 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; /* ID périphérique (si périphérique i−noeud */ 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 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 état */ }; |
Le champ st_dev décrit le périphérique sur laquel réside le fichier. le champ st_rdev décrit le périphérique que ce fichier (i−noeud) représente. Le champ st_size indique la taille du fichier (s’il s’agit d’un fichier régulier ou d’un lien symbolique) en octets. La taille d’un lien symbolique est la longueur de la chaîne représentant le chemin d’accès qu’il vise, sans l’octet nul final. Le champ st_blocks donne indique le nombre de blocks alloués au fichier, en unité de 512 octets (cette valeur peut être plus petite que st_size/512 par exemple, si le fichier contient des trous). Le champ st_blksize indique la taille de bloc « préférée » pour les entrées-sorties du système de fichiers (l’écriture dans un fichier par petits morceaux peut induire de nombreuses étapes lecture-modification-écriture peu efficaces). Les systèmes de fichiers de Linux n’implémentent pas tous les champs liés à la date. Certains systèmes de fichiers autorisent le montage de telle manière que les accès ne modifient pas le champ st_atime (voir l’option « noatime » de mount(8)). Le champ st_atime est modifié par les accès au fichier, c’est-à -dire 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-même, 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 répertoire est modifié lors de la création ou la suppression de fichiers en son sein. Le champ st_mtime n’est pas mis à jour lors de modification de propriétaire, groupe, mode ou nombre de liens physiques. Le champ st_ctime est modifié lors d’une écriture ou une modification de données concernant l’i−noeud (propriétaire, groupe, mode, etc.). Les macros POSIX suivantes sont fournies pour vérifier le type de fichier en utilisant le champ stmode : |
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 bloc ? |
|
S_ISFIFO(m) |
une FIFO ? |
|
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 : |