Développement système sous Linux
Christophe Blaess
Eyrolles
Chapitre 1
Concepts et outils1
Généralités sur le développement sous Linux1
Outils de développement4
Eclipse5
NetBeans6
Programmation en Python7
Éditeurs de texte8
Compilateur, éditeur de liens10
Débogueur, profileur13
Traitement du code source20
Suivi de versions23
Construction d'application24
Distribution du logiciel25
Bibliothèques supplémentaires pour le développement26
Interface utilisateur en mode texte26
Développement graphique27
Conclusion27
Chapitre 2
Les processus29
Principe des processus29
Identification par le PID32
Identification de l'utilisateur correspondant au processus36
Identification du groupe d'utilisateurs du processus44
Identification du groupe de processus48
Identification de session52
Capacités d'un processus55
Conclusion59
Chapitre 3
Exécution d'un programme61
Lancement d'un nouveau programme61
Causes d'échec de lancement d'un programme70
Fonctions simplifiées pour exécuter un sous-programme73
Conclusion83
Chapitre 4
Environnement et ligne de commande85
Variables d'environnement86
Variables d'environnement couramment utilisées94
Arguments en ligne de commande97
Options simples - SUSv499
Options longues - Gnu101
Sous-options105
Exemple complet d'accès à l'environnement106
Conclusion114
Chapitre 5
Fin d'un programme115
Terminaison d'un programme115
Terminaison normale d'un processus115
Terminaison anormale d'un processus120
Exécution automatique de routines de terminaison123
Attendre la fin d'un processus enfant128
Signaler une erreur139
Conclusion148
Chapitre 6
Déroulement des Pthreads149
Présentation150
Implémentation150
Création de threads152
Passage d'argument à la création d'un thread156
Partage d'espace mémoire159
Fin d'un thread161
Élimination d'un thread164
Récupération de la valeur de retour165
Détachement des threads167
Attributs des threads169
Synchronisation entre threads171
Les mutex172
Verrous R/W locks176
Conclusion177
Chapitre 7
Aspects avancés des Pthreads179
Annulation d'un thread179
Fonctions de nettoyage184
Variables conditions186
Types de mutex191
Mutex partagés et robustesse des mutex196
Taille de la pile197
Données globales privées198
Conclusion199
Chapitre 8
Fonctions horaires201
Horodatage et type time_t202
Lecture de l'heure203
Configuration de l'heure système209
Conversions, affichages de dates et d'heures211
Calcul d'intervalles225
Fuseau horaire227
Conclusion230
Chapitre 9
Sommeil des processus et contrôle des ressources231
Endormir un processus231
Utilisation des temporisations Unix238
Timers temps réel243
Notifications par descripteur247
Suivre l'exécution d'un processus249
Obtenir des statistiques sur un processus253
Limiter les ressources consommées par un processus256
Conclusion264
Chapitre 10
Ordonnancements sous Linux265
États d'une tâche265
Fonctionnement multitâche, priorités270
Modification de la priorité d'un autre processus276
Systèmes multiprocesseurs, migrations279
Consultation du processeur utilisé279
Choix des processeurs autorisés pour une tâche281
Ordonnancements temps réel284
Ordonnancement sous algorithme FIFO286
Ordonnancement sous algorithme RR287
Ordonnancement sous algorithme OTHER288
Récapitulation288
Temps Réel ?289
Modification de la politique d'ordonnancement290
Conclusion292
Chapitre 11
Gestion classique des signaux293
Généralités293
Liste des signaux sous Linux295
Signaux SIGABRT et SIGIOT295
Signaux SIGALRM, SIGVTALRM et SIGPROF296
Signaux SIGBUS et SIGSEGV297
Signaux SIGCHLD et SIGCLD297
Signaux SIGFPE et SIGSTKFLT298
Signal SIGHUP299
Signal SIGILL299
Signal SIGINT300
Signaux SIGIO et SIGPOLL301
Signal SIGKILL301
Signal SIGPIPE302
Signal SIGQUIT302
Signaux SIGSTOP, SIGCONT, et SIGTSTP302
Signal SIGTERM303
Signal SIGTRAP303
Signaux SIGTTIN et SIGTTOU303
Signal SIGURG304
Signaux SIGUSR1 et SIGUSR2304
Signal SIGWINCH305
Signaux SIGXCPU et SIGXFSZ305
Signaux temps réel306
Émission d'un signal sous Linux309
Délivrance des signaux311
Réception des signaux avec l'appel système signal()313
Conclusion324
Chapitre 12
Gestion portable des signaux325
Réception des signaux avec sigaction ()325
Configuration des ensembles de signaux329
Exemples d'utilisation de sigaction ()330
Blocage des signaux337
Attente d'un signal342
Écriture correcte d'un gestionnaire de signaux344
Utilisation d'un saut non local347
Un signal particulier : l'alarme350
Conclusion354
Chapitre 13
Signaux temps réel355
Caractéristiques des signaux temps réel356
Nombre de signaux temps réel356
Empilement des signaux bloqués357
Délivrance prioritaire des signaux358
Informations supplémentaires fournies au gestionnaire359
Émission d'un signal temps réel360
Traitement rapide des signaux temps réel368
Conclusion373
Chapitre 14
Gestion de la mémoire du processus375
Allocation et libération de mémoire375
Utilisation de malloc()376
Utilisation de calloc()383
Utilisation de realloc()386
Utilisation de free()388
Règles de bonne conduite pour l'allocation et la libération de mémoire388
Désallocation automatique avec alloca()391
Débogage des allocations mémoire394
Configuration de l'algorithme utilisé par malloc()398
Suivi des allocations et des libérations399
Surveillance automatique des zones allouées402
Fonctions d'encadrement personnalisées404
Utilisation de Valgrind406
Conclusion411
Chapitre 15
Gestion avancée de la mémoire413
Verrouillage de pages en mémoire413
Projection d'un fichier sur une zone mémoire417
Protection de l'accès à la mémoire428
Conclusion433
Chapitre 16
Utilisation des blocs mémoire et des chaînes435
Manipulation de blocs de mémoire436
Mesures, copies et comparaisons de chaînes442
Caractères accentués et codage UTF-8454
Recherches dans une zone de mémoire ou dans une chaîne461
Recherche dans un bloc de mémoire461
Recherche de caractères dans une chaîne463
Recherche de sous-chaînes464
Analyse lexicale468
Conclusion472
Chapitre 17
Tris, recherches et structuration des données473
Fonctions de comparaison473
Recherche linéaire, données non triées476
Recherches dichotomiques dans une table ordonnée482
Manipulation, exploration et parcours d'un arbre binaire489
Gestion d'une table de hachage495
Récapitulatif sur les méthodes d'accès aux données502
Conclusion504
Chapitre 18
Routines avancées de traitement des blocs mémoire505
Utilisation des expressions rationnelles505
Cryptage de données514
Cryptage élémentaire514
Cryptage simple et mots de passe515
Conclusion519
Chapitre 19
Types de données et conversions521
Types de données génériques521
Types de tailles définies523
Catégories de caractères523
Conversions entre catégories de caractères528
Conversions entre différents types530
Types et conversions mathématiques539
Nombres complexes539
Conversions de réels en entiers541
Infinis et erreurs543
Représentation des réels en virgule flottante546
Conclusion548
Chapitre 20
Entrées-sorties simplifiées549
Flux standard d'un processus549
Écritures dans un flux553
Écritures formatées553
Autres fonctions d'écriture formatée562
Écritures simples de caractères ou de chaînes566
Saisie de caractères570
Réinjection de caractère575
Saisie de chaînes de caractères577
Lectures formatées depuis un flux581
Conclusion592
Chapitre 21
Flux de données593
Différences entre flux et descripteurs593
Ouverture et fermeture d'un flux595
Ouverture normale d'un flux595
Fermeture d'un flux598
Présentation des buffers associés aux flux599
Ouvertures particulières de flux601
Lectures et écritures dans un flux604
Positionnement dans un flux608
Positionnement classique609
Positionnement compatible Unix 98611
Problèmes de portabilité615
Paramétrage des buffers associés à un flux616
Type de buffers616
Modification du type et de la taille du buffer618
État d'un flux622
Conclusion624
Chapitre 22
Descripteurs de fichiers625
Ouverture et fermeture d'un descripteur de fichier625
Lecture ou écriture sur un descripteur de fichier636
Primitives de lecture636
Primitives d'écriture639
Positionnement dans un descripteur de fichier648
Manipulation et duplication de descripteurs650
Duplication de descripteur654
Accès aux attributs du descripteur654
Attributs du fichier657
Verrouillage d'un descripteur659
Autre méthode de verrouillage667
Conclusion668
Chapitre 23
Communications classiques entre processus669
Les tubes670
Les tubes nommés684
Conclusion690
Chapitre 24
Communications avec les IPC691
Communications avec les IPC Posix692
Files de messages692
Mémoire partagée696
Sémaphores702
Administration des ressources existantes706
Les mécanismes IPC Système V707
Obtention d'une clé707
Ouverture de l'IPC708
Contrôle et paramétrage709
Files de messages709
Mémoire partagée713
Conclusion723
Chapitre 25
Entrées-sorties avancées725
Entrées-sorties non bloquantes725
Multiplexage d'entrées-sorties733
Attente d'événements - Multiplexage d'entrées733
Distribution de données - Multiplexage de sorties743
Entrées-sorties asynchrones745
Asynchronisme utilisant fcntl()745
Asynchronisme compatible Posix.1b747
Écritures synchronisées758
Conclusion762
Chapitre 26
Programmation réseau763
Réseaux et couches de communication763
Résolution de nom768
Services et numéros de ports774
Ordre des octets777
Conclusion780
Chapitre 27
Utilisation des sockets781
Concept de socket781
Création d'une socket782
Affectation d'adresse785
Mode connecté et mode non connecté788
Attente de connexions790
Demander une connexion796
Fermeture d'une socket801
Recevoir ou envoyer des données804
Accès aux options des sockets812
Programmation d'un démon ou utilisation de inetd818
Conclusion821
Chapitre 28
Accès au contenu des répertoires823
Lecture du contenu d'un répertoire824
Changement de répertoire de travail830
Création et suppression de répertoire836
Suppression ou déplacement de fichiers838
Fichiers temporaires842
Recherche de noms de fichiers844
Correspondance simple d'un nom de fichier844
Recherche sur un répertoire total847
Développement complet à la manière d'un shell851
Descente récursive de répertoires857
Conclusion860
Chapitre 29
Attributs des fichiers861
Informations associées à un fichier861
Autorisations d'accès866
Propriétaire et groupe d'un fichier868
Taille du fichier869
Horodatages d'un fichier872
Liens physiques873
Liens symboliques875
Noeud générique du système de fichiers879
Masque de création de fichier883
Surveillance du système de fichiers884
Conclusion888
Chapitre 30
Accès aux informations du système889
Groupes et utilisateurs889
Fichier des groupes890
Fichier des utilisateurs893
Fichier des interpréteurs shell895
Nom d'hôte et de domaine896
Nom d'hôte896
Identifiant d'hôte897
Informations sur le noyau898
Identification du noyau898
Informations sur l'état du noyau899
Système de fichiers901
Caractéristiques des systèmes de fichiers902
Informations sur un système de fichiers909
Montage et démontage des partitions911
Journalisation911
Journal utmp912
Fonctions X/Open916
Journal wtmp917
Journal syslog919
Conclusion923
Chapitre 31
Internationalisation925
Principe926
Catégories de localisations disponibles926
Traduction de messages930
Catalogues de messages gérés par catgets()931
Catalogues de messages Gnu GetText936
Configuration de la localisation940
Localisation et fonctions de bibliothèques944
Localisation et fonctions personnelles949
Conclusion956
Chapitre 32
Gestion du terminal957
Définition des terminaux957
Configuration d'un terminal959
Membre c_inflag de la structure termios963
Membre c_oflag de la structure termios964
Membre c_cflag de la structure termios965
Membre c_lflag de la structure termios966
Membre c_cc[] de la structure termios966
Basculement du terminal en mode brut970
Connexion à distance sur une socket975
Utilisation d'un pseudo-terminal978
Configuration d'un port série RS-232986
Conclusion995
Chapitre 33
Entrées-sorties par GPIO997
Port GPIO997
Accès aux GPIO par / sys998
Accès aux GPIO par / dev1001
Utilisation de la libgpiod1014
API sans contexte de la libgpiod1015
API avec contexte de la libgpiod1025
Conclusion1034
Bibliographie1035
Standards1035
Livres et articles1035
Index1037