Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. 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)

Informations

Livraison possible dès le 22 avril 2024
  • Livraison à partir de 0,01 €
  • Version en ligne offerte pendant 1 an
Livres rédigés par des auteurs francophones et imprimés à Nantes

Caractéristiques

  • Livre (broché) - 17 x 21 cm
  • ISBN : 978-2-409-02065-0
  • EAN : 9782409020650
  • Ref. ENI : EPPRSYL

Informations

  • Consultable en ligne immédiatement après validation du paiement et pour une durée de 10 ans.
  • Version HTML
Livres rédigés par des auteurs francophones et imprimés à Nantes

Caractéristiques

  • HTML
  • ISBN : 978-2-409-02066-7
  • EAN : 9782409020667
  • Ref. ENI : LNEPPRSYL
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 !
  • Testez vos connaissances à l'issue de chaque chapitre
  • Validez vos acquis

Téléchargements

Avant-propos
  1. Introduction
Introduction aux appels système Linux
  1. Notion d'appel système
    1. 1. Rôle du noyau
    2. 2. Appel système
      1. a. Exécution d’un appel système
      2. b. Mode utilisateur et mode noyau
    3. 3. Utilisation des appels système en langageC
      1. a. Fonctions enveloppes (wrappers)
      2. b. La fonction syscall()
      3. c. Fonctions de haut niveau
  2. Normes et standards
    1. 1. POSIX (Portable Operating System Interface X)
    2. 2. SUS (Single Unix Specification)
    3. 3. Linux et les normes
  3. Documentation
  4. Portabilité et types
  5. Gestion des erreurs
    1. 1. Code retour et variable errno
    2. 2. Fonctions de gestion des erreurs
  6. Un premier programme système
    1. 1. Documentation de l’appel système
    2. 2. Programme source
    3. 3. Compilation et exécution
Les fichiers
  1. Principes généraux
    1. 1. L’interface fichier universelle
    2. 2. Système de fichiers
    3. 3. Chemin d’accès d’un fichier
      1. a. Chemin d’accès absolu ou relatif
      2. b. Répertoire courant, répertoire parent
      3. c. Analyse d’un chemin d’accès
    4. 4. Types de fichiers
      1. a. Fichiers ordinaires (regular files)
      2. b. Répertoires
      3. c. Fichiers spéciaux
      4. d. Liens symboliques
      5. e. Tubes nommés et sockets
    5. 5. Gestion des fichiers ouverts
      1. a. Descripteur de fichier
      2. b. Table des fichiers ouverts par le processus
      3. c. Table des fichiers ouverts sur le système
      4. d. Table des inodes ouverts
    6. 6. Entrées/sorties standards
  2. Ouverture/fermeture d'un fichier
    1. 1. Appel système open()
    2. 2. Modes d’ouverture
    3. 3. Options d’ouverture
    4. 4. Exemples d’ouvertures de fichiers existants
      1. a. Lecture
      2. b. Écriture
      3. c. Écriture avec remise à zéro
      4. d. Lecture, sauf lien symbolique
      5. e. Lecture avec remise à zéro
    5. 5. Création d’un fichier
      1. a. Argument Permissions
      2. b. Gestion de l’umask
      3. c. Exemples de création d’un fichier
    6. 6. Erreurs
    7. 7. Fermeture d’un fichier
  3. Lecture d’un fichier
  4. Écriture d’un fichier
  5. Déplacement dans un fichier
  6. Gestion des fichiers ouverts
    1. 1. Obtenir les options d’ouverture
      1. a. Exemple
    2. 2. Modifier les options d’ouverture
  7. Duplication de descripteurs
    1. 1. Appel système dup()
    2. 2. Appel système dup2()
  8. Gestion des répertoires et des liens
    1. 1. Notion de lien physique
    2. 2. Répertoires et liens physiques
    3. 3. Processus et répertoires
    4. 4. Liens symboliques
    5. 5. Gestion des liens physiques
      1. a. Appel système link()
      2. b. Appel système unlink()
    6. 6. Changement de nom ou déplacement
    7. 7. Gestion des liens symboliques
      1. a. Création d’un lien symbolique :symlink()
      2. b. Lecture du chemin d’accès cible: readlink()
    8. 8. Créer un répertoire : mkdir()
    9. 9. Supprimer un répertoire : rmdir()
    10. 10. Lister le contenu d’un répertoire
      1. a. Ouvrir un répertoire : opendir(), fdopendir()
      2. b. Parcourir la liste d’un répertoire : readdir()
      3. c. Repartir du début de la liste : rewinddir()
      4. d. Fermer la liste : closedir()
      5. e. Exemple de parcours d’un répertoire
    11. 11. Gestion du répertoire courant
      1. a. Déterminer le répertoire courant: getcwd()
      2. b. Changer de répertoire courant : chdir(),fchdir()
      3. c. Exemple de changement de répertoire
    12. 12. Changer le répertoire racine du processus: chroot()
  9. Lire les attributs d'un fichier
    1. 1. Appels système stat(), lstat(), fstat()
    2. 2. Appel système fstatat()
    3. 3. Structure stat
    4. 4. Exemple
  10. Gestion du contrôle d'accès
    1. 1. Propriétaire et groupe d’un fichier
    2. 2. Changement de propriétaire et de groupe
    3. 3. Droits spéciaux d’un fichier
      1. a. setuserid bit
      2. b. setgroupid bit
      3. c. sticky bit
    4. 4. Permissions d’accès d’un fichier
      1. a. Types d’accès pour un répertoire
      2. b. Détermination des droits d’accès
    5. 5. Modifier les droits et permissions d’accès
    6. 6. Exemple de contrôle d’accès
  11. Verrouillage d'un fichier
    1. 1. Types de verrous
      1. a. Verrouillage consultatif ou impératif
      2. b. Verrouillage en lecture ou en écriture
    2. 2. Gestion des verrous par fcntl()
      1. a. Structure flock
      2. b. Commandes de gestion de verrou
      3. c. Libération de verrou
      4. d. Étreinte fatale
      5. e. Limites
      6. f. Exemple de gestion de verrou
  12. Fichiers gérés en mémoire (mapping)
    1. 1. Projection en mémoire : mmap()
    2. 2. Forcer la mise à jour du fichier projeté :msync()
    3. 3. Terminer une projection mémoire : munmap()
Les processus
  1. Processus et programme
    1. 1. Programme exécutable
    2. 2. Script
    3. 3. Processus
    4. 4. Zones mémoire d’un processus
  2. Attributs d’un processus
    1. 1. Identifiant du processus (PID)
    2. 2. Identifiant du parent du processus (PPID - ParentProcess ID)
    3. 3. Comptes utilisateur du processus (rUID, eUID)
      1. a. Identifiant utilisateur réel
      2. b. Identifiant utilisateur effectif
      3. c. Identifiant utilisateur setuid sauvegardé
      4. d. Identifiant utilisateur système de fichiers
    4. 4. Processus privilégié
    5. 5. Groupes utilisateurs du processus (GID, eGID)
      1. a. Identifiant groupe utilisateur réel
      2. b. Identifiant groupe utilisateur effectif
      3. c. Identifiant groupe utilisateur setgid sauvegardé
      4. d. Identifiant groupe utilisateur système defichiers
      5. e. Groupes utilisateurs supplémentaires
    6. 6. Répertoire courant du processus
    7. 7. Répertoire racine du processus
    8. 8. Valeur d’umask
    9. 9. Sessions et groupes de processus
      1. a. Session de processus
      2. b. Groupe de processus
      3. c. Utilisation
    10. 10. Le pseudosystème de fichiers proc
  3. Environnement d’un processus
    1. 1. Lire l’environnement : getenv()
    2. 2. Modifier l’environnement : setenv()
  4. Créer un processus : fork()
  5. Gestion des attributs d'un processus
    1. 1. Identifiants de processus : getpid(), getppid()
    2. 2. Identifiants de groupe et de session : getpgid(),getsid()
    3. 3. Identifiants d’utilisateurs : getuid()
    4. 4. Identifiants de groupes d’utilisateurs :getgid()
    5. 5. Modification des identifiants : setuid(),setgid()
      1. a. Description de setuid()
      2. b. Description de seteuid()
      3. c. Description de setreuid()
      4. d. Description de setresuid()
      5. e. Gestion des identifiants de groupes utilisateurs
      6. f. Gestion des identifiants de systèmes de fichiers
    6. 6. Exemples
  6. Terminaison d'un processus
    1. 1. Appel système _exit()
    2. 2. Appels indirects à _exit()
      1. a. La fonction exit()
      2. b. Terminaison de la fonction main()
    3. 3. Exemple
  7. Relations entre processus parent et enfant
    1. 1. Appel système wait()
    2. 2. Le signal SIGCHLD
    3. 3. Processus parent/enfant et fichiers
  8. Processus zombie
    1. 1. Adoption d’un processus orphelin
    2. 2. Exemple
  9. Chargement et exécution d'un programme externe
    1. 1. Appel système execve()
    2. 2. Exécution d’un script
    3. 3. Gestion des fichiers ouverts
    4. 4. La famille de fonctions exec()
    5. 5. La fonction system()
Les signaux
  1. Les principes
    1. 1. Qu’est-ce qu’un signal ?
    2. 2. Gestion par défaut des signaux
      1. a. Signal SIGKILL
      2. b. Fichier de vidage mémoire (core dump)
    3. 3. Modification de l’effet des signaux
    4. 4. Émission d’un signal
    5. 5. Réception d’un signal
  2. Les types de signaux
    1. 1. Signaux d’origine utilisateur
      1. a. Signaux liés au clavier
      2. b. La commande kill
    2. 2. Signaux émis à l’initiative du noyau
      1. a. Événements matériels
      2. b. Erreur du processus
      3. c. Événements liés aux processus
    3. 3. Liste des signaux traditionnels Linux
  3. Envoi d'un signal
    1. 1. Appel système kill()
    2. 2. Exemples
  4. Traitement des signaux
    1. 1. Appel système signal()
      1. a. Description d’un signal : psignal()
    2. 2. Appel système sigaction()
    3. 3. Bloquer un signal : sigprocmask()
      1. a. Liste des signaux pendants : sigpending()
      2. b. Exemple
    4. 4. Principes d’un gestionnaire de signal
      1. a. Fonctions réentrantes
      2. b. Rôle d’un gestionnaire de signal
      3. c. Protéger les sections critiques
      4. d. Signaux applicatifs
    5. 5. Attendre un signal quelconque : pause()
    6. 6. Traitement du signal SIGCHLD
      1. a. Gestionnaire d’attente de terminaison processus enfant
      2. b. Exemple de gestionnaire SIGCHLD
      3. c. Autres méthodes de gestion de la terminaisondes processus enfants
      4. d. Exemples
  5. Signaux et démons
    1. 1. Principes d’initialisation d’un daemon System V
    2. 2. Daemon géré par systemd
    3. 3. Daemons et signaux
Les tubes et les tubes nommés
  1. Les principes
    1. 1. Flot d’octets (bytestream)
    2. 2. Lecture dans un tube
    3. 3. Écriture dans un tube
    4. 4. Gestion des tubes par le noyau
      1. a. Inode d’un tube
      2. b. Durée de vie d’un tube
  2. Les tubes anonymes (pipes)
    1. 1. Création d’un tube
    2. 2. Attributs d’un tube
      1. a. Lecture des informations de l’inode
      2. b. Mode d’ouverture d’un tube
      3. c. L’appel système pipe2()
      4. d. Taille maximale d’un tube
      5. e. Exemples
    3. 3. Fermeture d’un tube
      1. a. Exemple
    4. 4. Utilisation d’un tube entre plusieurs processus
      1. a. Tube sur la ligne de commande
      2. b. Tube entre processus parent et enfant
      3. c. Exemple
    5. 5. Redirection et tube
      1. a. Principe
      2. b. Exemple
    6. 6. Tube avec une ligne de commande shell
    7. 7. Signaux et tubes
      1. a. Signal SIGPIPE
      2. b. Écriture interrompue
      3. c. Exemple
  3. Les tubes nommés
    1. 1. Création d’un tube nommé
    2. 2. Ouverture d’un tube nommé
      1. a. Ouverture non bloquante
      2. b. Exemple
    3. 3. Utilisation d’un tube nommé
      1. a. Lecture
      2. b. Écriture
      3. c. Fermeture
      4. d. Attributs et options d’ouverture d’un tube nommé
      5. e. Suppression
    4. 4. Exemple
Communication interprocessus (IPC)
  1. Principes de communication interprocessus
    1. 1. IPC System V et IPC POSIX
    2. 2. Fonctions des différents mécanismesd’IPC
      1. a. Segment de mémoire partagée
      2. b. Files d’attente de messages
      3. c. Sémaphores
  2. Les segments de mémoire partagée
    1. 1. Les segments de mémoire partagéeSystem V
      1. a. Création d’un segment de mémoirepartagée : shmget()
      2. b. Identifiants d’un segment de mémoire partagée
      3. c. Générer une clef d’identification: ftok()
      4. d. Exemple de création d’un segment de mémoirepartagée
      5. e. Informations sur un segment de mémoire partagéeSystem V : ipcs
      6. f. Accès à un segment de mémoirepartagée : shmat()
      7. g. Contrôle d’un segment de mémoirepartagée : shmctl()
      8. h. Détachement d’un segment de mémoirepartagée : shmdt()
    2. 2. Les segments de mémoire partagéePOSIX
      1. a. Création / ouverture d’unobjet de mémoire partagée : shm_open()
      2. b. Utilisation de l’objet mémoire partagée :mmap()
      3. c. Contrôle d’un objet de mémoirepartagée
      4. d. Suppression d’un objet de mémoirepartagée : shm_unlink()
  3. Les files d'attente de messages
    1. 1. Les files d’attente de messages System V
      1. a. Création d’une file d’attente demessages System V : msgget()
      2. b. Identifiants d’une file d’attente de messagesSystem V
      3. c. Générer une clef d’identification :ftok()
      4. d. Exemple de création d’une file d’attentede messages System V
      5. e. Informations sur une file d’attente de messagesSystem V : msgctl()
      6. f. Accès à une file d’attentede messages System V
      7. g. Envoi de messages : msgsnd()
      8. h. Lecture de messages : msgrcv()
      9. i. Contrôle d’une file d’attente demessages System V : msgctl()
    2. 2. Les files d’attente de messages POSIX
      1. a. Ouverture ou création d’une file d’attentede messages POSIX : mq_open()
      2. b. Exemple de création d’une file d’attentede messages POSIX
      3. c. Informations sur une file d’attente de messagesPOSIX
      4. d. Envoi de messages : mq_send()
      5. e. Lecture de messages : mq_receive()
      6. f. Contrôle d’une file d’attente demessages POSIX : mq_setattr()
      7. g. Fermeture d’une file d’attente de messagesPOSIX : mq_close()
      8. h. Suppression d’une file d’attente de messagesPOSIX : mq_unlink()
      9. i. Lecture/écriture de messages avectime-out : mq_timedsend(), mq_timedreceive()
      10. j. Lecture de messages par notification : mq_notify()
  4. Les sémaphores
    1. 1. Les sémaphores System V
      1. a. Créer un jeu de sémaphores SystemV : semget()
      2. b. Identifiants d’un jeu de sémaphores
      3. c. Générer une clef d’identification: ftok()
      4. d. Exemple de création d’un jeu de sémaphores
      5. e. Informations sur un jeu de sémaphores SystemV
      6. f. Contrôler et initialiser un jeu de sémaphoresSystem V : semctl()
      7. g. Utiliser un jeu de sémaphores System V :semop()
    2. 2. Les sémaphores POSIX
      1. a. Créer ou ouvrir un sémaphore POSIX: sem_open()
      2. b. Exemple de création d’un sémaphorePOSIX
      3. c. Informations sur un sémaphore POSIX : sem_getvalue()
      4. d. Utiliser un sémaphore POSIX : sem_post(),sem_wait()
      5. e. Fermer un sémaphore POSIX : sem_close()
      6. f. Supprimer un sémaphore POSIX : sem_unlink()
      7. g. Les sémaphores POSIX anonymes : sem_init(),sem_destroy()
Communication réseau par les sockets
  1. Principes des sockets
    1. 1. Rôle des sockets
    2. 2. Types de sockets
      1. a. Stream
      2. b. Datagramme
    3. 3. Domaines de communication
      1. a. Domaine IP version 4
      2. b. Domaine IP version 6
      3. c. Domaine Unix
  2. Gestion des adresses, numéros de port, noms d'hôtes et de services
    1. 1. Représentation des adresses et des données
      1. a. Représentation des données
    2. 2. Gestion des adresses de socket
      1. a. Structure générique sockaddr
      2. b. Structures de stockage des adresses sockets
      3. c. Conversion d’une adresse chaîne de caractèresen numérique : inet_pton()
      4. d. Conversion d’une adresse numérique en chaînede caractères : inet_ntop()
      5. e. Gestion des erreurs : gai_strerror()
    3. 3. Gestion des relations noms et adresses
      1. a. Anciennes fonctions
      2. b. Recherche d’adresse et/ou de numérode port : getaddrinfo()
      3. c. Recherche de nom d’hôte ou de service :getnameinfo()
  3. Sockets en mode stream
    1. 1. Créer une socket : socket()
    2. 2. Lier une socket à une adresse : bind()
    3. 3. Écouter une socket : listen()
    4. 4. Attente de connexion : accept()
    5. 5. Demande de connexion : connect()
    6. 6. Informations sur une socket : getsockname(),getpeername()
    7. 7. Fermer une connexion close(), shutdown()
      1. a. close()
      2. b. shutdown()
    8. 8. Utilisation d’une connexion socket : appelssystème fichiers
      1. a. Utilisation avec read(), write()
      2. b. Serveur monoprocessus
      3. c. Serveur multiprocessus
    9. 9. Utilisation d’une connexion socket : appelssystème spécifiques
      1. a. Réception : recv()
      2. b. Émission : send()
      3. c. Envoi d’un fichier : sendfile ()
      4. d. Exemple client-serveur send()/recv()/sendfile()
  4. Sockets en mode datagramme
    1. 1. Créer une socket datagramme : socket()
    2. 2. Lier une socket datagramme à une adresse :bind()
    3. 3. Utilisation de connect() en mode datagramme
    4. 4. Utiliser une socket datagramme
      1. a. Émission d’un datagramme : sendto()
      2. b. Réception d’un datagramme : recvfrom()
      3. c. Envoi de datagramme en broadcast
    5. 5. Exemple de communication par datagrammes
Les threads
  1. Principes des threads
    1. 1. Threads POSIX
    2. 2. Threads Linux
  2. Threads et processus
    1. 1. Threads et appels système de niveau processus
      1. a. Appel système execve() en contexte multithreads
      2. b. Appel système fork() en contexte multithreads
      3. c. Appel système exit() en contexte multithreads
      4. d. Threads et signaux
    2. 2. Multiprocessus ou multithreads??
      1. a. Avantages du multithreads
      2. b. Avantages du multiprocessus
  3. Gestion des threads
    1. 1. Création d’un thread : pthread_create()
      1. a. pthread_create()
      2. b. Identifiant d’un thread : pthread_self()
    2. 2. Terminaison d’un thread : pthread_exit()
      1. a. pthread_exit()
      2. b. Thread zombie
    3. 3. Attendre la terminaison d’un thread : pthread_join()
    4. 4. Détacher un thread : pthread_detach()
    5. 5. Annulation d’un thread : pthread_cancel()
  4. Synchronisation des threads
    1. 1. Mutex
      1. a. Initialisation d’un mutex
      2. b. Utilisation d’un mutex : pthread_mutex_lock(),pthread_mutex_unlock()
    2. 2. Variables conditionnelles
      1. a. Initialisation d’une variable conditionnelle
      2. b. Attendre une variable conditionnelle : pthread_cond_wait()
      3. c. Signaler un changement d’état d’une variableconditionnelle
Auteur : Philippe BANQUET

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

Découvrir tous ses livres

  • LINUX Maîtrisez l'administration du système (7e édition)
  • Linux Préparation à la certification LPIC-1 (examens LPI 101 et LPI 102) - [7e édition]
  • Linux Administration système et exploitation des services réseau (5e édition)
  • LINUX Préparation à la certification LPIC-2 (examens LPI 201 et LPI 202) - 5e édition
  • Nginx Mise en oeuvre en environnement Linux

Nos nouveautés

voir plus