• Aide
  • Eurêkoi Eurêkoi

Livre

Programmation système : maîtrisez les appels système Linux avec le langage C

Résumé

Permet de maîtriser la programmation Linux. Présente les notions de base sur les interfaces de programmation système. Pour les débutants, le dialogue est effectué avec l'interface graphique et avec l'interpréteur de commandes. Pour les développeurs, le dialogue avec le système est effectué avec les appels système. Avec des exercices corrigés. ©Electre 2019


  • Éditeur(s)
  • Date
    • cop. 2019
  • Notes
    • La couv. porte en plus : "En téléchargement : programmes d'exemple" ; "+ quiz" ; "Version numérique offerte ! www.editions-eni.fr" ; "Informatique technique"
    • Contient un "flashcode" permettant d'accéder à un contenu via Internet
    • La 4e de couv. porte en plus : "Sur www.editions-eni.fr : programmes d'exemple de mise en oeuvre des appels système Linuxen langage C"
  • Langues
    • Français
  • Description matérielle
    • 1 vol. (578 p.) : ill. ; 21 cm
  • Collections
  • Sujet(s)
  • ISBN
    • 978-2-409-02065-0
  • Indice
    • 681.44 Systèmes d'exploitation Unix, Linux
  • Quatrième de couverture
    • Programmation système

      Maîtrisez les appels système Linux avec le langage C

      Avec ce livre, le lecteur dispose des connaissances nécessaires pour maîtriser la programmation avec les appels système Linux, en langage C, et développer des applications s'interfaçant directement avec le noyau afin d'exploiter au maximum ses fonctionnalités. L'auteur s'appuie sur les versions récentes du noyau Linux et sur les implémentations modernes des appels système. Il s'adresse principalement à un public de programmeurs pratiquant le langage C et ayant déjà l'expérience d'une distribution GNU / Linux ou d'un système de type Unix.

      Après une description générale des appels système Linux (principes, normes, documentation...), l'auteur présente leurs principaux domaines d'utilisation. Il détaille la gestion des fichiers et des répertoires puis celle des processus avant d'étudier les mécanismes de communication et de synchronisation issus du monde Unix classique : les tubes (anonymes et nommés) et les signaux. L'auteur décrit ensuite les deux ensembles de mécanismes de communication inter processus (IPC) implémentés par le noyau Linux, ceux d'origine Unix System V et ceux, plus récents, définis dans le cadre des normes POSIX, permettant de gérer la mémoire partagée, les files d'attente de messages et les sémaphores. Il expose les techniques de communication réseau via les sockets, en mode connecté et en mode datagramme, et conclut le livre avec la gestion des threads POSIX.

      Pour faciliter la compréhension et l'acquisition réelle des différents mécanismes, l'auteur présente les concepts fondamentaux et les illustre par de nombreux programmes d'exemple en langage C, courts et faciles à appréhender, téléchargeables sur le site www.editions-eni.fr.


  • Tables des matières
      • Programmation système

      • Maîtrisez les appels système Linux avec le langage C

      • Avant propos
      • Chapitre 1
        Introduction aux appels système Linux
      • 1. Notion d'appel système17
      • 1.1 Rôle du noyau17
      • 1.2 Appel système18
      • 1.2.1 Exécution d'un appel système19
      • 1.2.2 Mode utilisateur et mode noyau19
      • 1.3 Utilisation des appels système en langage C20
      • 1.3.1 Fonctions enveloppes (wrappers)20
      • 1.3.2 La fonction syscall()21
      • 1.3.3 Fonctions de haut niveau22
      • 2. Normes et standards23
      • 2.1 POSIX (Portable Operating System Interface X)23
      • 2.2 SUS (Single Unix Specification)24
      • 2.3 Linux et les normes25
      • 3. Documentation25
      • 4. Portabilité et types27
      • 5. Gestion des erreurs28
      • 5.1 Code retour et variable errno28
      • 5.2 Fonctions de gestion des erreurs28
      • 6. Un premier programme système30
      • 6.1 Documentation de l'appel système30
      • 6.2 Programme source32
      • 6.3 Compilation et exécution33
      • Chapitre 2
        Les fichiers
      • 1. Principes généraux35
      • 1.1 L'interface fichier universelle35
      • 1.2 Système de fichiers36
      • 1.3 Chemin d'accès d'un fichier37
      • 1.3.1 Chemin d'accès absolu ou relatif37
      • 1.3.2 Répertoire courant, répertoire parent37
      • 1.3.3 Analyse d'un chemin d'accès38
      • 1.4 Types de fichiers40
      • 1.4.1 Fichiers ordinaires (regular files)40
      • 1.4.2 Répertoires40
      • 1.4.3 Fichiers spéciaux41
      • 14.4.4 Liens symboliques41
      • 14.4.5 Tubes nommés et sockets41
      • 1.5 Gestion des fichiers ouverts41
      • 1.5.1 Descripteur de fichier42
      • 1.5.2 Table des fichiers ouverts par le processus42
      • 1.5.3 Table des fichiers ouverts sur le système43
      • 1.5.4 Table des inodes ouverts43
      • 1.6 Entrées/sorties standards45
      • 2. Ouverture/fermeture d'un fichier46
      • 2.1 Appel système open()46
      • 2.2 Modes d'ouverture48
      • 2.3 Options d'ouverture48
      • 2.4 Exemples d'ouvertures de fichiers existants50
      • 2.4.1 Lecture50
      • 2.4.2 Écriture50
      • 2.4.3 Écriture avec remise à zéro51
      • 2.4.4 Lecture, sauf lien symbolique53
      • 2.4.5 Lecture avec remise à zéro53
      • 2.5 Création d'un fichier55
      • 2.5.1 Argument Permissions55
      • 2.5.2 Gestion de l'umask57
      • 2.5.3 Exemples de création d'un fichier57
      • 2.6 Erreurs60
      • 2.7 Fermeture d'un fichier61
      • 3. Lecture d'un fichier62
      • 4. Écriture d'un fichier65
      • 5. Déplacement dans un fichier71
      • 6. Gestion des fichiers ouverts75
      • 6.1 Obtenir les options d'ouverture76
      • 6.1.1 Exemple76
      • 6.2 Modifier les options d'ouverture79
      • 7. Duplication de descripteurs82
      • 7.1 Apple système dup()82
      • 7.2 Appel système dup2()85
      • 8. Gestion des répertoires et des liens87
      • 8.1 Notion de lien physique87
      • 8.2 Répertoires et liens physiques88
      • 8.3 Processus et répertoires89
      • 8.4 Liens symboliques89
      • 8.5 Gestion des liens physiques90
      • 8.5.1 Appel système link()90
      • 8.5.2 Appel système unlink()93
      • 8.6 Changement de nom ou déplacement95
      • 8.7 Gestion des liens symboliques99
      • 8.7.1 Création d'un lien symbolique : symlink()99
      • 8.7.2 Lecture du chemin d'accès cible : readlink()102
      • 8.8 Créer un répertoire : mkdir()104
      • 8.9 Supprimer un répertoire : rmdir()106
      • 8.10 Lister le contenu d'un répertoire107
      • 8.10.1 Ouvrir un répertoire : opendir(), fdopendir()108
      • 8.10.2 Parcourir la liste d'un répertoire : readdir()109
      • 8.10.3 Repartir du début de la liste : rewinddir()110
      • 8.10.4 Fermer la liste : closedir()110
      • 8.10.5 Exemple de parcours d'un répertoire110
      • 8.11 Gestion du répertoire courant112
      • 8.11.1 Déterminer le répertoire courant : getcwd()112
      • 8.11.2 Changer de répertoire courant : chdir(), fchdir()113
      • 8.11.3 Exemple de changement de répertoire113
      • 8.12 Changer le répertoire racine du processus : chroot()115
      • 9. Lire les attributs d'un fichier119
      • 9.1 Appels système stat(), lstat(), fstat()119
      • 9.2 Appel système fstatat()120
      • 9.3 Structure stat121
      • 9.4 Exemple125
      • 10. Gestion du contrôle d'accès127
      • 10.1 Propriétaire et groupe d'un fichier128
      • 10.2 Changement de propriétaire et de groupe129
      • 10.3 Droits spéciaux d'un fichier133
      • 10.3.1 setuserid bit133
      • 10.3.2 setgroupid bit134
      • 10.3.3 sticky bit134
      • 10.4 Permissions d'accès d'un fichier135
      • 10.4.1 Types d'accès pour un répertoire137
      • 10.4.2 Détermination des droits d'accès137
      • 10.5 Modifier les droits et permissions d'accès138
      • 10.6 Exemple de contrôle d'accès139
      • 11. Verrouillage d'un fichier142
      • 11.1 Types de verrous142
      • 11.1.1 Verrouillage consultatif ou impératif142
      • 11.1.2 Verrouillage en lecture ou en écriture144
      • 11.2 Gestion des verrous par fcntl()144
      • 11.2.1 Structure flock145
      • 11.2.2 Commandes de gestion de verrou146
      • 11.2.3 Libération de verrou147
      • 11.2.4 Étreinte fatale147
      • 11.2.5 Limites148
      • 11.2.6 Exemple de gestion de verrou148
      • 12. Fichiers gérés en mémoire (mapping)152
      • 12.1 Projection en mémoire : mmap()153
      • 12.2 Forcer la mise à jour du fichier projeté : msync ()157
      • 12.3 Terminer une projection mémoire : munmap()158
      • Chapitre 3
        Les processus
      • 1. Processus et programme159
      • 1.1 Programme exécutable159
      • 1.2 Script160
      • 1.3 Processus161
      • 1.4 Zones mémoire d'un processus161
      • 2. Attributs d'un processus162
      • 2.1 Identifiant du processus (PID)162
      • 2.2 Identifiant du parent du processus (PPID - Parent Process ID)163
      • 2.3 Comptes utilisateur du processus (rUID, eUID)163
      • 2.3.1 Identifiant utilisateur réel164
      • 2.3.2 Identifiant utilisateur effectif164
      • 2.3.3 Identifiant utilisateur setuid sauvegardé164
      • 2.3.4 Identifiant utilisateur système de fichiers165
      • 2.4 Processus privilégié165
      • 2.5 Groupes utilisateurs du processus (GID, eGID)166
      • 2.5.1 Identifiant groupe utilisateur réel166
      • 2.5.2 Identifiant groupe utilisateur effectif166
      • 2.5.3 Identifiant groupe utilisateur setgid sauvegardé167
      • 2.5.4 Identifiant groupe utilisateur système de fichiers167
      • 2.5.5 Groupes utilisateurs supplémentaires167
      • 2.6 Répertoire courant du processus167
      • 2.7 Répertoire racine du processus168
      • 2.8 Valeur d'umask168
      • 2.9 Sessions et groupes de processus168
      • 2.9.1 Session de processus168
      • 2.9.2 Groupe de processus169
      • 2.9.3 Utilisation170
      • 2.10 Le pseudosystème de fichiers proc170
      • 3. Environnement d'un processus172
      • 3.1 Lire l'environnement : getenv()172
      • 3.2 Modifier l'environnement : setenv()174
      • 4. Créer un processus : fork()176
      • 5. Gestion des attributs d'un processus180
      • 5.1 Identifiants de processus : getpid(), getppid()180
      • 5.2 Identifiants de groupe et de session : getpgid(), getsid()181
      • 5.3 Identifiants d'utilisateurs : getuid()181
      • 5.4 Identifiants de groupes d'utilisateurs : getgid()182
      • 5.5 Modification des identifiants : setuid(), setgid()183
      • 5.5.1 Description de setuid()184
      • 5.5.2 Description de seteuid()184
      • 5.5.3 Description de setreuid()184
      • 5.5.4 Description de setresuid()185
      • 5.5.5 Gestion des identifiants de groupes utilisateurs185
      • 5.5.6 Gestion des identifiants de systèmes de fichiers185
      • 5.6 Exemples185
      • 6. Terminaison d'un processus192
      • 6.1 Appel système_exit()192
      • 6.2 Appels indirects à_exit()193
      • 6.2.1 La fonction exit()193
      • 6.2.2 Terminaison de la fonction main()194
      • 6.3 Exemple194
      • 7. Relations entre processus parent et enfant196
      • 7.1 Appel système wait ()196
      • 7.2 Le signal SIGCHLD202
      • 7.3 Processus parent/enfant et fichiers203
      • 8. Processus zombie204
      • 8.1 Adoption d'un processus orphelin204
      • 8.2 Exemple205
      • 9. Chargement et exécution d'un programme externe207
      • 9.1 Appel système execve()207
      • 9.2 Exécution d'un script211
      • 9.3 Gestion des fichiers ouverts212
      • 9.4 La famille de fonctions exec()213
      • 9.5 La fonction system()217
      • Chapitre 4
        Les signaux
      • 1. Les principes221
      • 1.1 Qu'est-ce qu'un signal ?221
      • 1.2 Gestion par défaut des signaux222
      • 1.2.1 Signal SIGKILL223
      • 1.2.2 Fichier de vidage mémoire (core dump)223
      • 1.3 Modification de l'effet des signaux224
      • 1.4 Émission d'un signal225
      • 1.5 Réception d'un signal225
      • 2. Les types de signaux226
      • 2.1 Signaux d'origine utilisateur226
      • 2.1.1 Signaux liés au clavier226
      • 2.1.2 La commande kill226
      • 2.2 Signaux émis à l'initiative du noyau227
      • 2.2.1 Événements matériels227
      • 2.2.2 Erreur du processus227
      • 2.2.3 Événements liés aux processus228
      • 2.3 Liste des signaux traditionnels Linux228
      • 3. Envoi d'un signal230
      • 3.1 Appel système kill ()230
      • 3.2 Exemples232
      • 4. Traitement des signaux236
      • 4.1 Appel système signal ()237
      • 4.1.1 Description d'un signal : psignal ()238
      • 4.2 Appel système sigaction ()242
      • 4.3 Bloquer un signal : sigprocmask ()248
      • 4.3.1 Liste des signaux pendants : sigpending ()249
      • 4.3.2 Exemple250
      • 4.4 Principes d'un gestionnaire de signal253
      • 4.4.1 Fonctions réentrantes253
      • 4.4.2 Rôle d'un gestionnaire de signal253
      • 4.4.3 Protéger les sections critiques254
      • 4.4.4 Signaux applicatifs254
      • 4.5 Attendre un signal quelconque : pause ()254
      • 4.6 Traitement du signal SIGCHLD259
      • 4.6.1 Gestionnaire d'attente de terminaison processus enfant259
      • 4.6.2 Exemple de gestionnaire SIGCHLD259
      • 4.6.3 Autres méthodes de gestion de la terminaison des processus enfants262
      • 4.6.4 Exemples263
      • 5. Signaux et démons268
      • 5.1 Principes d'initialisation d'un daemon System V269
      • 5.2 Daemon géré par systemd270
      • 5.3 Daemons et signaux271
      • Chapitre 5
        Les tubes et les tubes nommés
      • 1. Les principes273
      • 1.1 Flot d'octets (bytestream)273
      • 1.2 Lecture dans un tube274
      • 1.3 Écriture dans un tube274
      • 1.4 Gestion des tubes par le noyau275
      • 1.4.1 Inode d'un tube275
      • 1.4.2 Durée de vie d'un tube276
      • 2. Les tubes anonymes (pipes)276
      • 2.1 Création d'un tube277
      • 2.2 Attributs d'un tube279
      • 2.2.1 Lecture des informations de l'inode279
      • 2.2.2 Mode d'ouverture d'un tube282
      • 2.2.3 L'appel système pipe2 ()282
      • 2.2.4 Taille maximale d'un tube283
      • 2.2.5 Exemples284
      • 2.3 Fermeture d'un tube289
      • 2.3.1 Exemple289
      • 2.4 Utilisation d'un tube entre plusieurs processus290
      • 2.4.1 Tube sur la ligne de commande291
      • 2.4.3 Exemple292
      • 2.5 Redirection et tube295
      • 2.5.1 Principe295
      • 2.5.2 Exemple296
      • 2.6 Tube avec une ligne de commande shell300
      • 2.7 Signaux et tubes303
      • 2.7.1 Signal SIGPIPE303
      • 2.7.2 Écriture interrompue303
      • 2.7.3 Exemple304
      • 3. Les tubes nommés307
      • 3.1 Création d'un tube nommé308
      • 3.2 Ouverture d'un tube nommé310
      • 3.2.1 Ouverture non bloquante310
      • 3.2.2 Exemple311
      • 3.3 Utilisation d'un tube nommé312
      • 3.3.1 Lecture312
      • 3.3.2 Écriture313
      • 3.3.3 Fermeture313
      • 3.3.4 Attributs et options d'ouverture d'un tube nommé313
      • 3.3.5 Suppression313
      • 3.4 Exemple314
      • Chapitre 6
        Communication interprocessus (IPC)
      • 1. Principes de communication interprocessus321
      • 1.1 IPC System V et IPC Posix322
      • 1.2 Fonctions des différents mécanismes d'IPC322
      • 1.2.1 Segment de mémoire partagée323
      • 1.2.2 Files d'attente de messages323
      • 1.2.3 Sémaphores323
      • 2. Les segments de mémoire partagée324
      • 2.1 Les segments de mémoire partagée System V325
      • 2.1.1 Création d'un segment de mémoire partagée : shmget()326
      • 2.1.2 Identifiants d'un segment de mémoire partagée327
      • 2.1.3 Générer un clef d'identification : ftok()328
      • 2.1.4 Exemple de création d'un segment de mémoire partagée328
      • 2.1.5 Informations sur un segment de mémoire partagée System V : ipcs329
      • 2.1.6 Accès à un segment de mémoire partagée : shmat()330
      • 2.1.7 Contrôle d'un segment de mémoire partagée : shmctl()334
      • 2.1.8 Détachement d'un segment de mémoire partagée : shmdt()339
      • 2.2 Les segments de mémoire partagée POSIX340
      • 2.2.1 Création / ouverture d'un objet de mémoire partagée : shm-open()340
      • 2.2.2 Utilisation de l'objet mémoire partagée : mmap()344
      • 2.2.3 Contrôle d'un objet de mémoire partagée347
      • 2.2.4 Suppression d'un objet de mémoire partagée : shm_unlink()350
      • 3. Les files d'attente de messages351
      • 3.1 Les files d'attente de messages System V351
      • 3.1.1 Création d'une file d'attente de messages System V : msgget()352
      • 3.1.2 Identifiants d'une file d'attente de messages System V354
      • 3.1.3 Générer une clef d'identification : ftok()354
      • 3.1.4 Exemple de création d'une file d'attente de messages System V355
      • 3.1.5 Informations sur une file d'attente de messages System V : msgctl()356
      • 3.1.6 Accès à une file d'attente de messages System V357
      • 3.1.7 Envoi de messages : msgsnd()357
      • 3.1.8 Lecture de messages : msgrcv()360
      • 3.1.9 Contrôle d'une file d'attente de messages System V : msgctl()364
      • 3.2 Les files d'attente de messages POSIX369
      • 3.2.1 Ouverture ou création d'une file d'attente de messages POSIX : mq_open()370
      • 3.2.2 Exemple de création d'une file d'attente de messages POSIX373
      • 3.2.3 Informations sur une file d'attente de messages POSIX374
      • 3.2.4 Envoi de messages : mq_send()375
      • 3.2.5 Lecture de messages : mq_receive()380
      • 3.2.6 Contrôle d'une file d'attente de messages POSIX : mq_setattr()383
      • 3.2.7 Fermeture d'une file d'attente de messages POSIX : mq_close()386
      • 3.2.8 Suppression d'une file d'attente de messages POSIX : mq_unlink()387
      • 3.2.9 Lecture/écriture de messages avec time-out : mq_timedsend(), mq_timedreceive()388
      • 3.2.10 Lecture de messages par notification : mq_notify()392
      • 4. Les sémaphores392
      • 4.1 Les sémaphores System V393
      • 4.1.1 Créer un jeu de sémaphores System V : semget()394
      • 4.1.2 Identifiants d'un jeu de sémaphores396
      • 4.1.3 Générer une clef d'identification : ftok()396
      • 4.1.4 Exemple de création d'un jeu de sémaphores397
      • 4.1.5 Informations sur un jeu de sémaphores System V398
      • 4.1.6 Contrôler et initialiser un jeu de sémaphores System V : semctl()399
      • 4.1.7 Utiliser un jeu de sémaphores System V : semop()407
      • 4.2 Les sémaphores POSIX412
      • 4.2.1 Créer ou ouvrir un sémaphore POSIX : sem_open()413
      • 4.2.2 Exemple de création d'un sémaphore POSIX415
      • 4.2.3 Informations sur un sémaphore POSIX : sem_getvalue()417
      • 4.2.4 Utiliser un sémaphore POSIX : sem_post(), sem_wait()419
      • 4.2.5 Fermer un sémaphore POSIX : sem_close()423
      • 4.2.6 Supprimer un sémaphore POSIX : sem_unlink()424
      • 4.2.7 Les sémaphores POSIX anonymes : sem_init(), sem_destroy()426
      • Chapitre 7
        Communication réseau par les sockets
      • 1. Principes des sockets433
      • 1.1 Rôle des sockets433
      • 1.2 Types de sockets434
      • 1.2.1 Stream434
      • 1.2.2 Datagramme434
      • 1.3 Domaines de communication435
      • 1.3.1 Domaine IP version 4435
      • 1.3.2 Domaine IP version 6435
      • 1.3.3 Domaine Unix435
      • 2. Gestion des adresses, numéros de port, noms d'hôtes et de services436
      • 2.1 Représentation des adresses et des données436
      • 2.1.1 Représentation des données438
      • 2.2 Gestion des adresses de socket438
      • 2.2.1 Structure générique sockaddr438
      • 2.2.2 Structures de stockage des adresses sockets439
      • 2.2.3 Conversion d'une adresse chaîne de caractères en numérique : inet_pton()440
      • 2.2.4 Conversion d'une adresse numérique en chaîne de caractères : inet_ntop()443
      • 2.2.5 Gestion des erreurs : gai_strerror()445
      • 2.3 Gestion des relations noms et adresses445
      • 2.3.1 Anciennes fonctions446
      • 2.3.2 Recherche d'adresse et/ou de numéro de port : getaddrinfo()450
      • 2.3.3 Recherche de nom d'hôte ou de service : getnameinfo()457
      • 3. Sockets en mode stream459
      • 3.1 Créer une socket : socket()460
      • 3.2 Lier une socket à une adresse : bind()462
      • 3.3 Écouter une socket : listen()469
      • 3.4 Attente de connexion : accept()470
      • 3.5 Demande de connexion : connect ()474
      • 3.6 Informations sur une socket : getsockname (), getpeername ()478
      • 3.7 Fermer une connexion close (), shutdown ()482
      • 3.7.1 close ()482
      • 3.7.2 shutdown ()482
      • 3.8 Utilisation d'une connexion socket : appels système fichiers483
      • 3.8.1 Utilisation avec read (), write ()483
      • 3.8.2 Serveur monoprocessus484
      • 3.8.3 Serveur multiprocessus493
      • 3.9 Utilisation d'une connexion socket : appels système spécifiques501
      • 3.9.1 Réception : recv ()501
      • 3.9.2 Émission : send ()502
      • 3.9.3 Envoi d'un fichier : sendfile ()503
      • 3.9.4 Exemple client-serveur send ()/recv ()/sendfile ()504
      • 4. Sockets en mode datagramme513
      • 4.1 Créer une socket datagramme : socket ()514
      • 4.2 Lier une socket datagramme à une adresse : bind ()515
      • 4.3 Utilisation de connect () en mode datagramme518
      • 4.4 Utiliser une socket datagramme518
      • 4.4.1 Émission d'un datagramme : sendto ()518
      • 4.4.2 Réception d'un datagramme : recvform ()519
      • 4.4.3 Envoi de datagramme en broadcast521
      • 4.5 Exemple de communication par datagrammes521
      • Chapitre 8
        Les threads
      • 1. Principes des threads529
      • 1.1 Threads POSIX530
      • 1.2 Threads Linux530
      • 2. Threads et processus530
      • 2.1 Threads et appels système de niveau processus531
      • 2.1.1 Appel système execve() en contexte multithreads531
      • 2.1.2 Appel système fork() en contexte multithreads531
      • 2.1.3 Appel système exit() en contexte multithreads531
      • 2.1.4 Threads et signaux531
      • 2.2 Multiprocessus ou multithreads ?532
      • 2.2.1 Avantages du multithreads532
      • 2.2.2 Avantages du multiprocessus533
      • 3. Gestion des threads533
      • 3.1 Création d'un thread : pthread_create()534
      • 3.1.1 pthread_create()534
      • 3.1.2 Identifiant d'un thread : pthread_self()535
      • 3.2 Terminaison d'un thread : pthread_exit()538
      • 3.2.1 pthread_exit()538
      • 3.2.2 Thred zombie539
      • 3.3 Attendre la terminaison d'un thread : pthread_join()539
      • 3.4 Détacher un thread : pthread_detach()543
      • 3.5 Annulation d'un thread : pthread_cancel()543
      • 4. Synchronisation des threads547
      • 4.1 Mutex547
      • 4.1.1 Initialisation d'un mutex548
      • 4.1.2 Utilisation d'un mutex : pthread_mutex_lock(), pthread_mutex_unlock()548
      • 4.2 Variables conditionnelles552
      • 4.2.1 Initialisation d'une variable conditionnelle553
      • 4.2.2 Attendre une variable conditionnelle : pthread_cond_wait()553
      • 4.2.3 Signaler un changement d'état d'une variable conditionnelle554
      • Index563

  • Origine de la notice:
    • Electre
  • Disponible - 681.44 BAN

    Niveau 3 - Informatique