Programmation Reseau et Systeme GL3
Programmation Reseau et Systeme GL3
Programmation Reseau et Systeme GL3
PROGRAMMATION RÉSEAU
ET SYSTÈME
SUPPORT DE COURS
Introduction Générale
La programmation système constitue un domaine fondamental de l’informatique qui permet
aux développeurs d’interagir directement avec les ressources de l’ordinateur. Contrairement
à la programmation applicative qui se concentre sur les fonctionnalités visibles par
l’utilisateur final, la programmation système s’intéresse aux mécanismes de bas niveau qui
font fonctionner nos ordinateurs.
Chapitre 1 : Généralités
Introduction
Le langage C, créé dans les années 70 par Dennis Ritchie, reste aujourd’hui le langage de
prédilection pour la programmation système. Ce choix n’est pas anodin : le C offre un
excellent compromis entre la programmation de bas niveau (proche de la machine) et la
programmation de haut niveau (lisible par l’humain). Il permet un contrôle précis des
ressources tout en restant suffisamment abstrait pour être portable entre différents
systèmes d’exploitation.
Le Segment Text (Code) : Ce segment, également appelé segment de code, contient les
instructions exécutables du programme. Il est en lecture seule pour empêcher le programme
de modifier accidentellement ses propres instructions. C’est ici que sont stockées vos
fonctions et le code compilé.
La Heap (Le Tas) : Zone de mémoire dynamique qui croît des adresses basses vers les
adresses hautes. C’est ici que sont allouées les mémoires demandées par malloc(), calloc(), et
realloc(). Cette zone est partagée entre tous les threads d’un programme et doit être gérée
explicitement par le programmeur.
La Stack (La Pile) : Zone de mémoire automatique qui croît des adresses hautes vers les
adresses basses. Elle stocke :
Page 3 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Page 4 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
1. Toujours vérifier les retours des fonctions d’allocation La mémoire n’est pas une
ressource infinie. Un échec d’allocation peut survenir à tout moment :
3. Éviter les fuites mémoire Une fuite mémoire survient quand on perd la référence
vers une zone mémoire allouée sans l’avoir libérée. Dans un programme à longue
durée d’exécution (comme un serveur), les fuites mémoire peuvent avoir des
conséquences graves.
*ptr = malloc(sizeof(int));
**ptr = 42;
}
Page 5 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
3. Arithmétique des Pointeurs : L’arithmétique des pointeurs est basée sur la taille du
type pointé :
struct Exemple {
char c; // 1 octet
int i; // 4 octets
short s; // 2 octets
};
Dans cet exemple, la taille de la structure ne sera pas 7 octets (1 + 4 + 2) mais probablement
12 octets à cause du padding. Le compilateur ajoute des octets de remplissage pour optimiser
l’accès mémoire.
Pour contrôler ce comportement :
struct Exemple {
char c;
int i;
short s;
} __attribute__((packed)); // Force l'absence de padding
Page 6 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Les Unions
Une union permet de partager le même espace mémoire entre différents types de données :
union Donnee {
int i; // 4 octets
float f; // 4 octets
char str[4];// 4 octets
};
enum Statut {
SUCCESS = 0,
ERROR_FILE = -1,
ERROR_NETWORK = -2,
ERROR_MEMORY = -3
};
Avantages :
• Code plus lisible et maintenable
• Typage fort
• Facilite le débogage
Typedef
Le typedef permet de créer des alias de types, particulièrement utile pour :
• Améliorer la lisibilité du code
• Faciliter la portabilité
Page 7 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
typedef struct {
char* nom;
int age;
enum Statut status;
} Personne;
Page 8 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Le paramètre mode définit les permissions du fichier lors de sa création (uniquement avec
O_CREAT) :
Gestion des Erreurs : Il est crucial de vérifier les retours de ces fonctions car plusieurs
situations peuvent survenir :
• Lectures/écritures partielles
• Interruptions par des signaux
• Erreurs d’E/S
nleft -= nread;
ptr += nread;
}
return (count - nleft);
}
Page 10 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
États Bloquants
Un tube peut provoquer des blocages dans certaines conditions :
• Lecture sur un tube vide
• Écriture sur un tube plein
• Écriture sur un tube dont toutes les extrémités de lecture sont fermées
(SIGPIPE)
Page 12 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Types de Sémaphores
1. Sémaphores Binaires
• Valeur limitée à 0 ou 1
• Similaire à un mutex
• Utilisé pour la protection de sections critiques
2. Sémaphores Compteurs
• Valeur peut être supérieure à 1
• Utilisé pour gérer des pools de ressources
• Permet de contrôler l’accès multiple
Opérations Fondamentales
1. sem_wait (P) : Opération de décrémentation
• Décrémente le compteur du sémaphore
• Si le compteur est à 0, le processus est bloqué
• Atomique et non interruptible
2. sem_post (V) : Opération d’incrémentation
• Incrémente le compteur du sémaphore
• Débloque un processus en attente si présent
• Atomique et non interruptible
Page 13 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
#include <semaphore.h>
#include <fcntl.h>
if (sem == SEM_FAILED) {
perror("sem_open a échoué");
exit(EXIT_FAILURE);
}
// Utilisation du sémaphore
sem_wait(sem); // Entrée en section critique
// ... Section critique ...
sem_post(sem); // Sortie de section critique
// Nettoyage
sem_close(sem);
sem_unlink("/mon_semaphore");
Page 15 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Création et Utilisation
struct shared_data {
sem_t mutex; // Pour la synchronisation
int count; // Données partagées
char buffer[1024]; // Zone de données
};
Page 16 sur 17
Programmation réseau et système Eric Vekout, M. Ing.,
Page 17 sur 17