Appels système

Stat System Call Tutoriel Linux

Stat System Call Tutoriel Linux

Appels système Linux

Les appels système fournis par le noyau Linux sont exposés dans le langage de programmation C via la glibc.  Lorsqu'un appel système est utilisé, vous communiquez avec le système d'exploitation et au retour, le système d'exploitation vous communique via les paramètres qui sont renvoyés aux fonctions d'appel système (valeurs de retour).

Appel système de statistiques :

L'appel système Stat est un appel système sous Linux pour vérifier l'état d'un fichier, par exemple pour vérifier quand le fichier a été accédé. L'appel système stat() renvoie en fait des attributs de fichier. Les attributs de fichier d'un inode sont essentiellement renvoyés par la fonction Stat(). Un inode contient les métadonnées du fichier. Un inode contient : le type du fichier, la taille du fichier, quand le fichier a été accédé (modifié, supprimé) c'est-à-dire les horodatages, et le chemin du fichier, l'ID utilisateur et l'ID de groupe, les liens du fichier , et l'adresse physique du contenu du fichier.

On peut dire que l'inode contient toutes les données nécessaires à l'appel système stat() et c'est le numéro d'index du fichier qui est enregistré dans la table inode. Chaque fois que vous créez un fichier, un numéro d'inode pour ce fichier est créé. En utilisant l'appel système stat, les tables système peuvent être visualisées.

Syntaxe de l'appel système C Stat :

Pour utiliser l'appel système stat en langage de programmation C, vous devez inclure le fichier d'en-tête suivant :

#inclure

Stat est utilisé pour obtenir le statut d'un fichier. La syntaxe de l'appel système C stat peut ne pas être la même pour tous les systèmes d'exploitation. Sous Linux, la syntaxe de l'appel système stat est la suivante :

int stat(const char *chemin, struct stat *buf)

Le type de retour de la fonction dans entier, si la fonction est exécutée avec succès, 0 est retourné s'il y a des erreurs, -1 sera retourné.

Ici const char *chemin spécifie le nom du fichier. Si le chemin du fichier est un lien symbolique, vous devez spécifier le lien au lieu du nom du fichier.

Alors dans la fonction on a un structure des statistiques dans lequel les données ou informations sur le fichier sont stockées qui utilise un pointeur nommé buf, qui est passé en paramètre et renseigné lors de l'exécution de l'appel et lisible par l'utilisateur après l'appel.

Structure des statistiques :

La structure statistique qui est définie dans Le fichier d'en-tête contient les champs suivants :

struct stat

mode_t         st_mode ;
ino_t          st_ino ;
dev_t          st_dev ;
dev_t          st_rdev ;
nlink_t        st_nlink ;
uid_t          st_uid ;
gid_t          st_gid ;
off_t          st_size ;
struct timspec st_atim ;
struct timspec st_mtim ;
struct timspec st_ctim ;
blksize_t      st_blksize ;
blkcnt_t       st_blocks ;
 ;

La description:

  1. st_dev : C'est l'ID de l'appareil dans lequel notre fichier réside actuellement.
  2. st_rdev : Ce champ décrit qu'un fichier particulier représente un périphérique particulier.
  3. st_ino : C'est le numéro d'inode ou le numéro de série du fichier. Comme il s'agit d'un numéro d'index, il doit être unique pour tous les fichiers
  4. taille_st : st_size est la taille du fichier en octets.
  5. st_atime : C'est la dernière fois ou l'heure récente à laquelle le fichier a été accédé.
  6. st_ctime : Il s'agit de l'heure récente à laquelle le statut ou les autorisations du fichier ont été modifiés.
  7. st_mtime : C'est l'heure récente à laquelle le fichier a été modifié.
  8. st_blksize : Ce champ donne la taille de bloc préférée pour le système de fichiers d'E/S qui peut varier d'un fichier à l'autre.
  9. st_blocs : Ce champ indique le nombre total de blocs en multiples de 512 octets.
  10. st_nlink : Ce champ indique le nombre total de liens physiques.
  11. st_uid : Ce champ indique l'identifiant de l'utilisateur.
  12. st_gid : Ce champ indique l'ID du groupe.
  13. st_mode : Il indique les permissions sur le fichier, indique les modes sur un fichier. Voici les indicateurs qui doivent être définis pour le champ st_mode :
Drapeaux La description Valeur du drapeau
S_IFMT Un masque de bits utilisé pour obtenir la valeur de mode d'un fichier 0170000
S_IFSOCK Une constante de fichier de socket 0140000
S_IFLINK Un fichier constant de lien symbolique 0120000
S_IFREG Constante de fichier pour un fichier normal 0100000
S_IFBLK Constante de fichier pour le fichier de bloc 0060000
S_IFDIR Constante de fichier pour le fichier de répertoire 0040000
S_IFCHR Constante de fichier pour le fichier de caractères 0020000
S_IFIFO Une constante de fichier de fifo 0010000
S_ISUID Définir le bit d'ID utilisateur 0004000
S_ISGID Définir le bit d'ID de groupe 0002000
S_ISVTX Bit collant qui indique le texte partagé 0001000
S_IRWXU Autorisations du propriétaire (lecture, écriture, exécution) 00700
S_IRUSR Lire les autorisations pour le propriétaire 00400
S_IWUSR Autorisations d'écriture pour le propriétaire 00200
S_IXUSR Exécuter les autorisations pour le propriétaire 00100
S_IRWXG Autorisations de groupe (lecture, écriture, exécution) 00070
S_IRGRP Lire les autorisations pour le groupe 00040
S_IWGRP Autorisations d'écriture pour le groupe 00020
S_IXGRP Exécuter les autorisations pour le groupe 00010
S_IRWXO Autorisations pour les autres (lecture, écriture, exécution) 00007
S_IROTH Lire les autorisations pour les autres 00004
S_IWOTH Écrire des autorisations pour les autres 00002
S_IXOTH Exécuter les autorisations pour les autres 00001

Comment utiliser l'appel système Stat :

L'exemple suivant montre comment utiliser l'appel système stat en langage de programmation C sous Linux, Ubuntu.

EXEMPLE 1:

Dans le code suivant nous allons trouver le mode d'un fichier :

CODE:

#inclure
#inclure
int main()

//pointeur vers la structure statistique
struct stat sfile;
//stat appel système
stat("stat.c", &sfile);
//accès à st_mode (membre de données de stat struct)
printf("st_mode = %o", sfile.st_mode);
renvoie 0 ;

La compilation et l'exécution du programme renvoient comme ci-dessous :

Dans ce code, nous avons passé le nom du fichier dans l'appel système stat puis le pointeur vers stat struct qui est sfile. Le pointeur vers stat struct est ensuite utilisé pour accéder à st_mode qui affiche le mode du fichier à l'aide de l'instruction printf.

Le fichier d'en-tête est utilisé pour que vous puissiez utiliser l'appel système stat. Le fichier d'en-tête est le fichier de bibliothèque d'entrée/sortie standard afin que vous puissiez utiliser printf ou scanf dans votre code C.

EXEMPLE 2 :

Dans le code suivant, nous allons obtenir des informations sur le fichier en utilisant l'appel système stat :

CODE:

#inclure
#inclure
#inclure
#inclure
void sfile(char const filename[]);
int main()
ssize_t lu;
tampon char* = 0;
size_t buf_size = 0;
printf("Entrez le nom d'un fichier à vérifier : \n");
read = getline(&buffer, &buf_size, stdin);
si (lire <=0 )
printf("getline a échoué\n");
sortie(1);

if (tampon[lecture-1] == '\n')
tampon[lecture-1] = 0 ;

int s=open(tampon,O_RDONLY);
si(s==-1)
printf("Le fichier n'existe pas\n");
sortie(1);

autre
sfile(tampon);

libre (tampon);
renvoie 0 ;

void sfile(char const filename[])
struct stat sfile;
if(stat(nom_fichier,&sfichier)==-1)
printf("Une erreur s'est produite\n");

//Accès aux données membres de stat struct
printf("\nFichier st_uid %d \n",sfichier.st_uid);
printf("\nFichier st_blksize %ld \n",sfichier.st_blksize);
printf("\nFichier st_gid %d \n",sfichier.st_gid);
printf("\nFichier st_blocks %ld \n",sfichier.st_blocks);
printf("\nFichier st_size %ld \n",sfile.taille_st);
printf("\nFichier st_nlink %u \n",(unsigned int)sfile.st_nlink);
printf("\nUtilisateur des autorisations de fichier\n");
printf((fichier.st_mode & S_IRUSR)? "r":"-");
printf((fichier.st_mode & S_IWUSR)? "w":"-");
printf((fichier.st_mode & S_IXUSR)? "X":"-");
printf("\n");
printf("\nGroupe d'autorisations de fichiers\n");
printf((fichier.st_mode & S_IRGRP)? "r":"-");
printf((fichier.st_mode & S_IWGRP)? "w":"-");
printf((fichier.st_mode & S_IXGRP)? "X":"-");
printf("\n");
printf("\nAutorisations de fichier autre\n");
printf((fichier.st_mode & S_IROTH)? "r":"-");
printf((fichier.st_mode & S_IWOTH)? "w":"-");
printf((fichier.st_mode & S_IXOTH)? "X":"-");
printf("\n");

PRODUCTION:

Dans le code C ci-dessus, nous avons entré le nom du fichier et si le fichier n'existe pas alors l'exécution du programme sera arrêtée. Ceci est démontré dans l'image suivante :

Si notre fichier existe, la fonction sfile(n) sera appelée dans laquelle on aura passé le nom du fichier. A l'intérieur de la fonction, tout d'abord nous avons utilisé l'appel système Stat, si stat() renvoie -1 alors il doit y avoir une erreur donc un message sera affiché et l'exécution du programme sera arrêtée.

Ensuite, dans l'instruction printf, nous avons utilisé le nom de la fonction et le séparateur de points pour accéder aux données membres de structure statistique.

Ensuite pour le mode de fichier on a accédé aux macros ou flags de st_mode. Ici, logique et opérateur sont utilisés pour imprimer les modes respectifs. Nous avons vérifié les autorisations pour l'utilisateur, le groupe et d'autres pour le fichier spécifié (nom de fichier entré par l'utilisateur).

Avec cela, vous pouvez voir comment utiliser l'appel système stat du langage de programmation C pour obtenir des informations du noyau du système d'exploitation sur les fichiers.  Si vous avez une question, n'hésitez pas à nous le dire via la section commentaire.

Tutoriel Shadow of the Tomb Raider pour Linux
Shadow of the Tomb Raider est le douzième ajout à la série Tomb Raider - une franchise de jeux d'action-aventure créée par Eidos Montréal. Le jeu a ét...
Comment booster les FPS sous Linux?
FPS signifie Images par seconde. La tâche du FPS est de mesurer la fréquence d'images dans les lectures vidéo ou les performances de jeu. En termes si...
Meilleurs jeux de laboratoire d'applications Oculus
Si vous êtes propriétaire d'un casque Oculus, vous devez être au courant du chargement latéral. Le chargement latéral est le processus d'installation ...