Cours ‐ Synthèse sur les appels systèmes - vbridonneau/CoursSysteme GitHub Wiki

Les appels systèmes

Les appels systèmes fournissent une interface entre une application et le système d'exploitation. Cette page se concentre principalement sur l'utilisation des appels systèmes en C et donne quelques exemples de tels appels.

Interface C

Pour effectuer un appel système en C, il est possible d'utiliser la surcouche syscall que l'on obtient en incluant :

#include <unistd.h>
#include <sys/syscall.h>   /* For SYS_xxx definitions */

long syscall(long number, ...);

Chaque appel système à un identifiant sous la forme SYS_xxx. Les points de suspensions ... vont être remplacer par les paramètres de l'appel système que l'on souhaite effectuer. Il existe une interface à chaque appel système pour ne pas avoir à passer par syscall, mais pour directement exécuter un appel système précis. Les appels systèmes en C sont souvent encapsulés dans des fonctions portant leur nom et ont souvent un prototype ressemblant à :

int appel_system(... /* paramères */);

Le retour de chaque appel système est tel qu'il vaut 0 ou une valeur positive si l'appel s'est exécuté sans incident. Autrement, le retour est négatif (égal à -1) et errno contient le code d'erreur associé au problème rencontré.

Dans la suite, nous allons voir une liste d'appel système permettant de manipuler certaines ressources.

Bonne pratiques

Lorsque l'on effectue un appel système en C, il convient de toujours vérifier la valeur de retour. Comme évoqué précédemment cette valeur est négative égale à -1 (sauf dans certains cas particuliers). Ainsi, lorsque l'on effectue des appels systèmes, il faut être vigilant et s'assurer que tous c'est bien passer. Dans ce but, on pourra par exemple par exemple utiliser une fonction verification qui servira à gérer le retour d'un appel système :

void verification(int codeErreur) {
    if (codeErreur < 0) {
        perror(""); /* Affiche la raison de l'erreur */
        exit(EXIT_FAILURE); /* Sort du programme */
    } 
}

Systeme de fichier

Les appels systèmes présentés ici permettent de manipuler des fichiers :

Appel système Description
open Ouverture/création d'un fichier
close Fermeture d'un fichier
write Ecriture dans un fichier
read Lecture dans un fichier
fstat Permet d'obtenir des informations d'un fichier à partir d'un descripteur de fichier qui lui est associé
stat Permet d'obtenir des informations d'un fichier à partir de son nom
statx Permet d'obtenir des informations supplémentaires par rapport à stat (date de création par exemple)
mkdir Permet de créer un répertoire

Processus

Les appels systèmes relatifs à la géstion des processus peut être résumé dans le tableau suivant :

Appel système Description
fork Création d'un processus
vfork Création d'un processus pour appeler execve juste après
clone Création d'un processus plus précise qu'avec fork
clone3 Plus récent que clone
wait Attente de l'un des processus
waitpid Attente d'un processus en particulier
getpid Récupération de l'identifiant d'un processus
getppid Récupération de l'identifiant du parent d'un processus

Ils seront abordés lorsque nous aborderons la question de la gestion des processus.

⚠️ **GitHub.com Fallback** ⚠️