Voici un document détaillé sur la programmation système en C avec fork et variables d'environnement :
Programmation Système en C : Processus, fork
et Variables d’Environnement
1. Les Processus et leur Identité
Un processus est un programme en cours d'exécution. Chaque processus a un identifiant unique,
appelé PID (Process ID). - Le processus père crée un ou plusieurs processus fils. - Chaque fils peut
connaître le PID de son père avec getppid() . - Chaque processus connaît son propre PID avec
getpid() .
Exemple :
• Père PID = 1000
• Fils PID = 1001
• PPID du fils = 1000
2. Création de Processus avec fork()
fork() duplique le processus appelant. - Après fork() , il y a deux processus identiques mais
indépendants. - La valeur de retour de fork() permet de savoir où l’on est :
Valeur Signification
-1 Erreur, aucun processus fils créé
0 Fils, code exécuté dans le processus fils
>0 Père, valeur = PID du fils
Exemple :
pid_t pid = fork();
if (pid == 0) {
printf("Je suis le fils, PID=%d\n", getpid());
} else if (pid > 0) {
printf("Je suis le père, PID=%d, mon fils=%d\n", getpid(), pid);
} else {
perror("fork");
}
1
3. Gestion des erreurs de fork()
fork() peut échouer temporairement ( EAGAIN ) ou définitivement ( ENOMEM ). - Pour gérer les
erreurs temporaires, on peut réessayer avec une boucle :
do {
pid = fork();
} while ((pid == -1) && (errno == EAGAIN));
- Si une erreur définitive survient, le programme retourne -1 et s'arrête.
4. Terminaison des Processus
• Le fils se termine avec exit(code) :
• EXIT_SUCCESS = 0
• EXIT_FAILURE = 1
• Le père peut récupérer le code du fils avec wait(&status) et analyser :
if (WIFEXITED(status)) {
printf("Code de retour : %d\n", WEXITSTATUS(status));
}
if (WIFSIGNALED(status)) {
printf("Tué par le signal : %d\n", WTERMSIG(status));
}
5. Affichage et informations système
• printf() pour l’affichage standard
• perror() pour afficher une erreur liée à errno
• getpid() et getppid() pour récupérer les PIDs
Exemple de sortie :
Nous sommes dans le fils !
Le PID du fils est 1201.
Le PPID du fils est 1200.
Nous sommes dans le père !
Le PID du fils est 1201.
Le PID du père est 1200.
Terminaison normale du processus fils.
Code de retour : 1.
2
6. Variables d’environnement
• Ce sont des variables système ou utilisateur qui influencent les programmes.
• Exemples : PATH , HOME , USER
Fonctions principales :
Fonction Rôle
getenv("NOM") Lire une variable
setenv("NOM","valeur",1) Créer/modifier
unsetenv("NOM") Supprimer
putenv("NOM=valeur") Ajouter une variable
Exemple :
#include <stdio.h>
#include <stdlib.h>
int main() {
char *val = getenv("PATH");
if (val != NULL) printf("PATH=%s\n", val);
return 0;
}
7. Concepts Avancés
• Communication entre processus : pipes, sockets, mémoire partagée
• Signaux pour contrôler les processus : kill() , SIGKILL , SIGTERM
• Boucles de retry pour erreurs temporaires ( EAGAIN )
• Types système pour portabilité : pid_t , uid_t , gid_t
8. Bonnes pratiques
1. Toujours utiliser pid_t pour les PID
2. Vérifier les erreurs de fork() et wait()
3. Le fils et le père exécutent du code différent après fork
4. Utiliser wait() pour récupérer le code de retour du fils
5. Lire les variables d’environnement avec getenv()
3
9. Résumé
Ce document couvre : - La création et gestion de processus avec fork() - La récupération des codes
de retour du fils avec wait() - L’affichage des informations systèmes - La lecture et manipulation des
variables d’environnement
Ces concepts permettent de comprendre et maîtriser la programmation système sous Unix/Linux en
C.