1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| Nom
stat, fstat, lstat - Obtenir le statut d'un fichier (file status).
Synopsis
#include <sys/types.h>
#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 mentionné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 contenant les champs suivants :
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 induire de nombreuses étapes lecture-modification-écriture peu efficaces).
Les systèmes de fichiers de Linux n'implémentent pas tous les champs "time". Certains systèmes de fichiers autorise 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 exec(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 généralement 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, une lecture, 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 :
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:
Le bit Set-GID (S_ISGID) a plusieurs utilisations particulières : pour un répertoire, il indique que la sémantique BSD doit être appliquée en son sein, c'est à dire que les fichiers qui y sont créés héritent leur GID du répertoire et non pas du GID effectif du processus créateur, et les sous-répertoire auront automatiquement le bit S_ISGID actif. Pour les fichiers qui n'ont pas d'autorisation d'exécution 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 répertoire indique que les fichiers qui s'y trouvent ne peuvent être renommés ou effacés que par leur propriétaire, par le propriétaire du répertoire ou par root.
Valeur Renvoyée
Ces fonctions retournent zéro 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épertoire.
ELOOP
Trop de liens symboliques rencontrés dans le chemin d'accès.
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",
sts . st_blksize);
fprintf (stdout,
"Nombre de blocs : %lu\n",
sts . st_blocks);
} |