Très bien, conforme à mes attentes, je recommande !
Anonyme- Supports de cours
- Programmation système - Maîtrisez les appels système Linux avec le langage C (Nouvelle édition)
Programmation système Maîtrisez les appels système Linux avec le langage C (Nouvelle édition)
1 avis
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...
Consulter des extraits du livre en ligne
Aperçu du livre papier
- Niveau Expert
- Nombre de pages 578 pages
- Parution septembre 2019
- Niveau Expert
- Parution septembre 2019
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 sur le site www.editions-eni.fr.
Quizinclus dans
la version en ligne !
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 sur le site www.editions-eni.fr.
Quizinclus dans
la version en ligne !
- Testez vos connaissances à l'issue de chaque chapitre
- Validez vos acquis
Téléchargements
Avant-propos
- Introduction
Introduction aux appels système Linux
- Notion d'appel système
- 1. Rôle du noyau
- 2. Appel système
- a. Exécution d’un appel système
- b. Mode utilisateur et mode noyau
- 3. Utilisation des appels système en langageC
- a. Fonctions enveloppes (wrappers)
- b. La fonction syscall()
- c. Fonctions de haut niveau
- 1. POSIX (Portable Operating System Interface X)
- 2. SUS (Single Unix Specification)
- 3. Linux et les normes
- 1. Code retour et variable errno
- 2. Fonctions de gestion des erreurs
- 1. Documentation de l’appel système
- 2. Programme source
- 3. Compilation et exécution
Les fichiers
- Principes généraux
- 1. L’interface fichier universelle
- 2. Système de fichiers
- 3. Chemin d’accès d’un fichier
- a. Chemin d’accès absolu ou relatif
- b. Répertoire courant, répertoire parent
- c. Analyse d’un chemin d’accès
- 4. Types de fichiers
- a. Fichiers ordinaires (regular files)
- b. Répertoires
- c. Fichiers spéciaux
- d. Liens symboliques
- e. Tubes nommés et sockets
- 5. Gestion des fichiers ouverts
- a. Descripteur de fichier
- b. Table des fichiers ouverts par le processus
- c. Table des fichiers ouverts sur le système
- d. Table des inodes ouverts
- 6. Entrées/sorties standards
- 1. Appel système open()
- 2. Modes d’ouverture
- 3. Options d’ouverture
- 4. Exemples d’ouvertures de fichiers existants
- a. Lecture
- b. Écriture
- c. Écriture avec remise à zéro
- d. Lecture, sauf lien symbolique
- e. Lecture avec remise à zéro
- a. Argument Permissions
- b. Gestion de l’umask
- c. Exemples de création d’un fichier
- 1. Obtenir les options d’ouverture
- a. Exemple
- 1. Appel système dup()
- 2. Appel système dup2()
- 1. Notion de lien physique
- 2. Répertoires et liens physiques
- 3. Processus et répertoires
- 4. Liens symboliques
- 5. Gestion des liens physiques
- a. Appel système link()
- b. Appel système unlink()
- a. Création d’un lien symbolique :symlink()
- b. Lecture du chemin d’accès cible: readlink()
- a. Ouvrir un répertoire : opendir(), fdopendir()
- b. Parcourir la liste d’un répertoire : readdir()
- c. Repartir du début de la liste : rewinddir()
- d. Fermer la liste : closedir()
- e. Exemple de parcours d’un répertoire
- a. Déterminer le répertoire courant: getcwd()
- b. Changer de répertoire courant : chdir(),fchdir()
- c. Exemple de changement de répertoire
- 1. Appels système stat(), lstat(), fstat()
- 2. Appel système fstatat()
- 3. Structure stat
- 4. Exemple
- 1. Propriétaire et groupe d’un fichier
- 2. Changement de propriétaire et de groupe
- 3. Droits spéciaux d’un fichier
- a. setuserid bit
- b. setgroupid bit
- c. sticky bit
- a. Types d’accès pour un répertoire
- b. Détermination des droits d’accès
- 1. Types de verrous
- a. Verrouillage consultatif ou impératif
- b. Verrouillage en lecture ou en écriture
- a. Structure flock
- b. Commandes de gestion de verrou
- c. Libération de verrou
- d. Étreinte fatale
- e. Limites
- f. Exemple de gestion de verrou
- 1. Projection en mémoire : mmap()
- 2. Forcer la mise à jour du fichier projeté :msync()
- 3. Terminer une projection mémoire : munmap()
Les processus
- Processus et programme
- 1. Programme exécutable
- 2. Script
- 3. Processus
- 4. Zones mémoire d’un processus
- Attributs d’un processus
- 1. Identifiant du processus (PID)
- 2. Identifiant du parent du processus (PPID - ParentProcess ID)
- 3. Comptes utilisateur du processus (rUID, eUID)
- a. Identifiant utilisateur réel
- b. Identifiant utilisateur effectif
- c. Identifiant utilisateur setuid sauvegardé
- d. Identifiant utilisateur système de fichiers
- 4. Processus privilégié
- 5. Groupes utilisateurs du processus (GID, eGID)
- a. Identifiant groupe utilisateur réel
- b. Identifiant groupe utilisateur effectif
- c. Identifiant groupe utilisateur setgid sauvegardé
- d. Identifiant groupe utilisateur système defichiers
- e. Groupes utilisateurs supplémentaires
- 6. Répertoire courant du processus
- 7. Répertoire racine du processus
- 8. Valeur d’umask
- 9. Sessions et groupes de processus
- a. Session de processus
- b. Groupe de processus
- c. Utilisation
- 10. Le pseudosystème de fichiers proc
- 1. Lire l’environnement : getenv()
- 2. Modifier l’environnement : setenv()
- 1. Identifiants de processus : getpid(), getppid()
- 2. Identifiants de groupe et de session : getpgid(),getsid()
- 3. Identifiants d’utilisateurs : getuid()
- 4. Identifiants de groupes d’utilisateurs :getgid()
- 5. Modification des identifiants : setuid(),setgid()
- a. Description de setuid()
- b. Description de seteuid()
- c. Description de setreuid()
- d. Description de setresuid()
- e. Gestion des identifiants de groupes utilisateurs
- f. Gestion des identifiants de systèmes de fichiers
- 1. Appel système _exit()
- 2. Appels indirects à _exit()
- a. La fonction exit()
- b. Terminaison de la fonction main()
- 1. Appel système wait()
- 2. Le signal SIGCHLD
- 3. Processus parent/enfant et fichiers
- 1. Adoption d’un processus orphelin
- 2. Exemple
- 1. Appel système execve()
- 2. Exécution d’un script
- 3. Gestion des fichiers ouverts
- 4. La famille de fonctions exec()
- 5. La fonction system()
Les signaux
- Les principes
- 1. Qu’est-ce qu’un signal ?
- 2. Gestion par défaut des signaux
- a. Signal SIGKILL
- b. Fichier de vidage mémoire (core dump)
- 3. Modification de l’effet des signaux
- 4. Émission d’un signal
- 5. Réception d’un signal
- 1. Signaux d’origine utilisateur
- a. Signaux liés au clavier
- b. La commande kill
- a. Événements matériels
- b. Erreur du processus
- c. Événements liés aux processus
- 1. Appel système kill()
- 2. Exemples
- 1. Appel système signal()
- a. Description d’un signal : psignal()
- a. Liste des signaux pendants : sigpending()
- b. Exemple
- a. Fonctions réentrantes
- b. Rôle d’un gestionnaire de signal
- c. Protéger les sections critiques
- d. Signaux applicatifs
- a. Gestionnaire d’attente de terminaison processus enfant
- b. Exemple de gestionnaire SIGCHLD
- c. Autres méthodes de gestion de la terminaisondes processus enfants
- d. Exemples
- 1. Principes d’initialisation d’un daemon System V
- 2. Daemon géré par systemd
- 3. Daemons et signaux
Les tubes et les tubes nommés
- Les principes
- 1. Flot d’octets (bytestream)
- 2. Lecture dans un tube
- 3. Écriture dans un tube
- 4. Gestion des tubes par le noyau
- a. Inode d’un tube
- b. Durée de vie d’un tube
- 1. Création d’un tube
- 2. Attributs d’un tube
- a. Lecture des informations de l’inode
- b. Mode d’ouverture d’un tube
- c. L’appel système pipe2()
- d. Taille maximale d’un tube
- e. Exemples
- a. Exemple
- a. Tube sur la ligne de commande
- b. Tube entre processus parent et enfant
- c. Exemple
- a. Principe
- b. Exemple
- a. Signal SIGPIPE
- b. Écriture interrompue
- c. Exemple
- 1. Création d’un tube nommé
- 2. Ouverture d’un tube nommé
- a. Ouverture non bloquante
- b. Exemple
- a. Lecture
- b. Écriture
- c. Fermeture
- d. Attributs et options d’ouverture d’un tube nommé
- e. Suppression
Communication interprocessus (IPC)
- Principes de communication interprocessus
- 1. IPC System V et IPC POSIX
- 2. Fonctions des différents mécanismesd’IPC
- a. Segment de mémoire partagée
- b. Files d’attente de messages
- c. Sémaphores
- 1. Les segments de mémoire partagéeSystem V
- a. Création d’un segment de mémoirepartagée : shmget()
- b. Identifiants d’un segment de mémoire partagée
- c. Générer une clef d’identification: ftok()
- d. Exemple de création d’un segment de mémoirepartagée
- e. Informations sur un segment de mémoire partagéeSystem V : ipcs
- f. Accès à un segment de mémoirepartagée : shmat()
- g. Contrôle d’un segment de mémoirepartagée : shmctl()
- h. Détachement d’un segment de mémoirepartagée : shmdt()
- a. Création / ouverture d’unobjet de mémoire partagée : shm_open()
- b. Utilisation de l’objet mémoire partagée :mmap()
- c. Contrôle d’un objet de mémoirepartagée
- d. Suppression d’un objet de mémoirepartagée : shm_unlink()
- 1. Les files d’attente de messages System V
- a. Création d’une file d’attente demessages System V : msgget()
- b. Identifiants d’une file d’attente de messagesSystem V
- c. Générer une clef d’identification :ftok()
- d. Exemple de création d’une file d’attentede messages System V
- e. Informations sur une file d’attente de messagesSystem V : msgctl()
- f. Accès à une file d’attentede messages System V
- g. Envoi de messages : msgsnd()
- h. Lecture de messages : msgrcv()
- i. Contrôle d’une file d’attente demessages System V : msgctl()
- a. Ouverture ou création d’une file d’attentede messages POSIX : mq_open()
- b. Exemple de création d’une file d’attentede messages POSIX
- c. Informations sur une file d’attente de messagesPOSIX
- d. Envoi de messages : mq_send()
- e. Lecture de messages : mq_receive()
- f. Contrôle d’une file d’attente demessages POSIX : mq_setattr()
- g. Fermeture d’une file d’attente de messagesPOSIX : mq_close()
- h. Suppression d’une file d’attente de messagesPOSIX : mq_unlink()
- i. Lecture/écriture de messages avectime-out : mq_timedsend(), mq_timedreceive()
- j. Lecture de messages par notification : mq_notify()
- 1. Les sémaphores System V
- a. Créer un jeu de sémaphores SystemV : semget()
- b. Identifiants d’un jeu de sémaphores
- c. Générer une clef d’identification: ftok()
- d. Exemple de création d’un jeu de sémaphores
- e. Informations sur un jeu de sémaphores SystemV
- f. Contrôler et initialiser un jeu de sémaphoresSystem V : semctl()
- g. Utiliser un jeu de sémaphores System V :semop()
- a. Créer ou ouvrir un sémaphore POSIX: sem_open()
- b. Exemple de création d’un sémaphorePOSIX
- c. Informations sur un sémaphore POSIX : sem_getvalue()
- d. Utiliser un sémaphore POSIX : sem_post(),sem_wait()
- e. Fermer un sémaphore POSIX : sem_close()
- f. Supprimer un sémaphore POSIX : sem_unlink()
- g. Les sémaphores POSIX anonymes : sem_init(),sem_destroy()
Communication réseau par les sockets
- Principes des sockets
- 1. Rôle des sockets
- 2. Types de sockets
- a. Stream
- b. Datagramme
- 3. Domaines de communication
- a. Domaine IP version 4
- b. Domaine IP version 6
- c. Domaine Unix
- 1. Représentation des adresses et des données
- a. Représentation des données
- a. Structure générique sockaddr
- b. Structures de stockage des adresses sockets
- c. Conversion d’une adresse chaîne de caractèresen numérique : inet_pton()
- d. Conversion d’une adresse numérique en chaînede caractères : inet_ntop()
- e. Gestion des erreurs : gai_strerror()
- a. Anciennes fonctions
- b. Recherche d’adresse et/ou de numérode port : getaddrinfo()
- c. Recherche de nom d’hôte ou de service :getnameinfo()
- 1. Créer une socket : socket()
- 2. Lier une socket à une adresse : bind()
- 3. Écouter une socket : listen()
- 4. Attente de connexion : accept()
- 5. Demande de connexion : connect()
- 6. Informations sur une socket : getsockname(),getpeername()
- 7. Fermer une connexion close(), shutdown()
- a. close()
- b. shutdown()
- a. Utilisation avec read(), write()
- b. Serveur monoprocessus
- c. Serveur multiprocessus
- a. Réception : recv()
- b. Émission : send()
- c. Envoi d’un fichier : sendfile ()
- d. Exemple client-serveur send()/recv()/sendfile()
- 1. Créer une socket datagramme : socket()
- 2. Lier une socket datagramme à une adresse :bind()
- 3. Utilisation de connect() en mode datagramme
- 4. Utiliser une socket datagramme
- a. Émission d’un datagramme : sendto()
- b. Réception d’un datagramme : recvfrom()
- c. Envoi de datagramme en broadcast
Les threads
- Principes des threads
- 1. Threads POSIX
- 2. Threads Linux
- Threads et processus
- 1. Threads et appels système de niveau processus
- a. Appel système execve() en contexte multithreads
- b. Appel système fork() en contexte multithreads
- c. Appel système exit() en contexte multithreads
- d. Threads et signaux
- 1. Threads et appels système de niveau processus
- 2. Multiprocessus ou multithreads??
- a. Avantages du multithreads
- b. Avantages du multiprocessus
- 1. Création d’un thread : pthread_create()
- a. pthread_create()
- b. Identifiant d’un thread : pthread_self()
- a. pthread_exit()
- b. Thread zombie
- 1. Mutex
- a. Initialisation d’un mutex
- b. Utilisation d’un mutex : pthread_mutex_lock(),pthread_mutex_unlock()
- a. Initialisation d’une variable conditionnelle
- b. Attendre une variable conditionnelle : pthread_cond_wait()
- c. Signaler un changement d’état d’une variableconditionnelle
Philippe BANQUET
Philippe BANQUET est ingénieur informaticien indépendant depuis plus de 20 ans. Il est spécialisé dans le développement (langage C, Perl, shell) et dans l'administration système Linux et Unix. Il assure également des missions de formation auprès d’un public d’informaticiens pour les préparer aux certifications Linux. Combinant son expérience concrète de terrain et sa pratique de formateur, il utilise dans ses ouvrages une démarche très pédagogique s'appuyant sur des exemples fonctionnels pour transmettre efficacement ses compétences.
En savoir plus