|
Le développement d'applications sur un système Linux ou Unix s'appuie sur une
interface de programmation proposée par le noyau (les appels-système) et des
bibliothèques (et principalement : la LibC). Ce cours passe en revue les
éléments essentiels offerts par cette API.
Les exemples sont étudiés sur un système Linux mais l'accent est mis sur la
portabilité des concepts introduits et le respect du standard Unix actuel
(norme SUSv3).
Organisation
Durée : 5 jours.
Pré-requis : les participants doivent avoir une connaissance
du système Unix/Linux (niveau utilisateur) et une bonne familiarité avec le
langage C.
Thèmes abordés
- Développement sous Linux/Unix :
environnements et outils de développement, méthodes de mise au point et débogage ;
- Multitâche sous Linux/Unix :
fonctionnement des processus et des threads, domaines d'application respectifs de
ces deux méthodes de programmation multitâche ;
- Gestion de la mémoire :
organisation détaillée de la mémoire virtuelle, fiabilité des allocations mémoire,
outils de débogage ;
- Synchronisation et communications entre processus :
signaux classiques et temps-réel, files de message, mémoire partagée, sémaphores et mutex,
tubes de communication ;
- Etude des entrées-sorties :
descripteurs bas-niveau et flux haut-niveau, paramétrage et utilisation de mécanismes
d'entrée-sortie avancés ;
- Programmation réseau sous Linux/Unix :
écriture de clients et serveurs TCP/IP, communications en UDP/IP unicast, broadcast et
multicast ;
Plan détaillé
Première journée
1ère séquence 9h00-10h30
Environnement Linux : influences, noyaux et composants d'un système Linux, rôle de la bibliothèque C, licences et distributions.
2ème séquence 10h45-12h15
Outils de développement : environnements intégrés et éditeurs classiques, compilateurs, débogueurs, outils de mise au point.
Travaux pratiques : prise en main des outils de développement, et de mise au point.
Pause déjeuner
3ème séquence 13h30-15h15
Caractéristiques des processus : Concept de processus, identifiants, déroulement, code de retour.
Travaux pratiques : suivi de processus, visualisation des identifiants, état "zombie".
4ème séquence 15h30-17h00
Début et fin d'un processus : création, fin volontaire ou anticipée, routines de terminaison, attente d'un processus fils.
Travaux pratiques : création de processus, vérification de l'indépendance des espaces mémoire, attente de la fin d'un fils,
conditions de terminaison du fils.
Deuxième journée
1ère séquence 9h00-10h30
Exécution d'un nouveau programme : primitive exec() et fonction system(), popen() et pclose().
Travaux pratiques : exécutions de programmes, appels de sous-programmes, implémentation de la fonction system()
2ème séquence 10h45-12h15
Les threads Posix.1c : présentation, exécution des threads, terminaison et attente.
Travaux pratiques : création d'un thread, vérification du partage des espaces mémoire, attente de la fin d'un thread,
arguments et valeurs de retour, attributs et détachement.
Pause déjeuner
3ème séquence 13h30-15h15
Synchronisation des threads : nécessité de synchronisation, protection par mutex ou verrous rwlock.
Travaux pratiques : accès incontrôlé à une variable commune, régulation par mutex et rwlock.
4ème séquence 15h30-17h00
Fonctionnement de la mémoire virtuelle : espace d'adressage et mémoire physique, segmentation et pagination, fautes de page.
Contenu de l'espace d'adressage : accès au contenu, exploration, projection en mémoire.
Travaux pratiques : exploration de l'espace mémoire, emplacement des variables dynamiques, projection de fichier en mémoire.
Troisième journée
1ère séquence 9h00-10h30
Allocation de mémoire : fonctions classiques et primitives bas-niveau, garanties de réussite ou d'échec, sur-réservation.
Travaux pratiques : configuration de malloc() avec mallopt(), utilisation de mmap() pour partager de la mémoire
entre processus, garanties de réussite des allocations, consultation des blocs fournis par calloc(), saturation de la mémoire.
2ème séquence 10h45-12h15
Utilisation de la mémoire : configuration des pages, indication d'usage, détection des fuites, détection des débordements.
Sensibilisation à la sécurité : failles liées aux débordements de buffers, exploitation d'une faille, routines critiques.
Travaux pratiques : détection de débordement de chaîne avec MALLOC_CHECK et valgrind, recherche de fuite mémoire avec
mtrace() et valgrind, allocation de zone mémoire et protection en lecture-seule.
Pause déjeuner
3ème séquence 13h30-15h15
Signaux Unix : principes, signaux usuels, émission et réception, écriture d'un gestionnaire.
Travaux pratiques : réception de signaux, émission de signaux, blocage et déblocage de signaux, signaux BSD et System V.
4ème séquence 15h30-17h00
Traitements avancés des signaux : blocage et attente, signaux temps-réel.
Travaux pratiques : attentes de signaux, réception de signaux temps-réel, émission de signaux temps-réel, empilements et
priorités des signaux temps-réel, attente de signaux temps-réel, mesure du débit des signaux temps-réel.
Quatrième journée
1ère séquence 9h00-10h30
Communication entre processus : IPC System V et Posix, files de messages, partage de mémoire et sémaphores.
Travaux pratiques : communication par files de message, utilisation de segment de mémoire partagée, synchronisation
par un sémaphore, examen des ressources IPC créées.
2ème séquence 10h45-12h15
Tubes de communication : principes, création et utilisation, duplication d'un descripteur, tubes nommés.
Travaux pratiques : dialogue à l'aide d'un tube simple,e xécution de commandes avec redirection, communication
par tube nommé depuis le shell, mécanisme client-serveur avec tubes nommés.
Pause déjeuner
3ème séquence 13h30-15h15
Descripteurs de fichiers : création et utilisation des descripteurs
Flux de bibliothèque C : création, utilisation, paramétrage des flux.
Travaux pratiques : lecture ligne à ligne, accès indirect à l'entrée standard, configuration du buffer de sortie,
écriture avec fwrite(), écriture avec write().
4ème séquence 15h30-17h00
Entrées-sorties avancés : multiplexage, opérations non-bloquante et synchronisées.
Travaux pratiques : coût de la synchronisation d'écriture, multiplexage d'entrées, lecture non-bloquante
Cinquième journée
1ère séquence 9h00-10h30
Entrées-sorties avancées : opérations asynchrones, indication d'usage d'un fichier.
Travaux pratiques : lectures asynchrones par différentes méthodes.
2ème séquence 10h45-12h15
Pthreads avancés : annulation des threads, variables conditions, organisation de l'espace mémoire, configuration de la pile, traitement des signaux.
Travaux pratiques : annulation d'un thread, utilisation des fonctions de nettoyage, utilisation des variables conditions,
comparaison de création des threads et des processus, comparaison du déroulement des threads et des processus,
temps de création et d'exécution des threads en mode utilisateur et en mode noyau.
Pause déjeuner
3ème séquence 13h30-15h15
Programmation réseau : principe, résolution de noms, écriture de client TCP/IP, de serveur TCP/IP,
communications en UDP/IP, options des sockets.
Travaux pratiques : mise en oeuvre d'un client TCP/IP et des serveurs TCP/IP multithreads et multiprocessus.
4ème séquence 15h30-17h00
Conclusion : discussion libre sur les thèmes abordés durant la formation.
|