Accueil Formations Développements Documents Présentation Contact
Logiciels
• Netpipe
• IP-multiserv
Autres logiciels…
Articles
• Linux : histoire d'un noyau
• Lancer une application au démarrage de Linux
• Sécuriser l'accès à une station Linux
Autres articles…
Documents
• Aides-mémoire Unix & Linux
• Manuel Linux en français
Livres
• Programmation système en C sous Linux
• Langages de scripts sous Linux
Présentation
• Renseignements
• Contact
Programmation système sous Linux et Unix

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.

Accueil | Contact | Mentions légales

Conception : Logilin - Formations Linux