Introduction à System V IPC sous Linux

Ce forum est dédié à apprendre le développement de programmes user mode sur Linux

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 114
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Introduction à System V IPC sous Linux

Post by Hydraxx »

Introduction à System V IPC sous Linux

Objectif

System V IPC (Inter-Process Communication) désigne une famille historique de mécanismes Unix permettant à plusieurs processus de communiquer ou de se synchroniser.

Les trois mécanismes principaux sont :
  • Files de messages : échange de messages structurés entre processus.
  • Sémaphores : synchronisation entre processus.
  • Mémoire partagée : plusieurs processus accèdent aux mêmes pages mémoire.
Même si ces mécanismes sont anciens, ils restent importants pour comprendre le fonctionnement d'Unix/Linux, certains logiciels existants, et les principes fondamentaux de l'IPC.

1. Vue générale

Les trois familles System V IPC utilisent le même modèle général :

Code: Select all

clé IPC
   |
   v
appel "get"
   |
   v
identifiant IPC retourné par le kernel
   |
   v
utilisation de l'objet
   |
   v
suppression explicite
Les appels principaux sont :

Code: Select all

Message queues : msgget()
Semaphores     : semget()
Shared memory  : shmget()
Chaque appel retourne un identifiant entier propre au mécanisme :

Code: Select all

int msqid;
int semid;
int shmid;
La clé et l'identifiant IPC ne sont pas la même chose.

La clé sert principalement à créer ou retrouver un objet.
L'identifiant retourné par le kernel est ensuite utilisé par les autres appels système.

2. En-têtes principaux

Les interfaces System V IPC utilisent principalement :

Code: Select all

#include <sys/types.h>
#include <sys/ipc.h>
Puis un en-tête spécifique au mécanisme :

Code: Select all

#include <sys/msg.h>   // message queues
#include <sys/sem.h>   // semaphores
#include <sys/shm.h>   // shared memory
3. Les clés IPC : key_t

Une clé System V IPC est représentée par :

Code: Select all

key_t
Elle permet à plusieurs processus indépendants de désigner le même objet IPC.

Deux grandes possibilités existent :

1. Utiliser IPC_PRIVATE.
2. Générer une clé avec ftok().


4. IPC_PRIVATE

IPC_PRIVATE demande au kernel de créer un nouvel objet IPC.

Exemple :

Code: Select all

int shmid = shmget(IPC_PRIVATE, 4096, 0600);
IPC_PRIVATE ne signifie pas "permissions privées".

Il signifie essentiellement : créer un nouvel objet, sans chercher un objet existant portant une clé partagée.

Cette méthode est pratique quand l'identifiant IPC peut ensuite être transmis à d'autres processus, par exemple après fork().

5. ftok()

Prototype :

Code: Select all

#include <sys/types.h>
#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);
Exemple :

Code: Select all

key_t key = ftok("/tmp/app.ipc", 'A');

if (key == (key_t)-1) {
    perror("ftok");
}
ftok() fabrique une clé à partir :
  • d'un chemin existant ;
  • d'un identifiant de projet.
Cette clé peut ensuite être utilisée par msgget(), semget() ou shmget().

La clé générée par ftok() n'est pas garantie mondialement unique.

Elle est surtout un mécanisme pratique permettant à plusieurs processus de produire la même clé en utilisant les mêmes paramètres.

6. IPC_CREAT et IPC_EXCL

Les appels msgget(), semget() et shmget() acceptent des flags communs.

IPC_CREAT

Créer l'objet s'il n'existe pas.

Exemple :

Code: Select all

msgget(key, IPC_CREAT | 0600);
Si l'objet existe déjà, son identifiant est généralement retourné.

IPC_EXCL

Utilisé avec IPC_CREAT, il exige que l'objet n'existe pas déjà.

Exemple :

Code: Select all

msgget(key, IPC_CREAT | IPC_EXCL | 0600);
Si l'objet existe déjà, l'appel échoue avec EEXIST.

C'est utile pour savoir quel processus a réellement créé l'objet.

7. Permissions

Les objets System V IPC ont un modèle de permissions comparable aux fichiers Unix.

Exemple :

Code: Select all

0600
0660
0666
Les permissions distinguent principalement :
  • propriétaire ;
  • groupe ;
  • autres.
Les bits contrôlent généralement les droits de lecture et d'écriture selon le mécanisme.

Les métadonnées communes utilisent notamment une structure de type :

Code: Select all

struct ipc_perm
Elle contient notamment des informations liées au propriétaire, au groupe, aux permissions et à la clé.

8. Persistance des objets System V IPC

Contrairement à de nombreux objets liés directement à un descripteur de fichier, un objet System V IPC peut continuer à exister dans le kernel même après la fin du processus qui l'a créé.

Exemple :

Code: Select all

programme crée une queue
programme se termine
queue encore présente
Cela implique qu'un programme doit prévoir son nettoyage.

Un crash ou une terminaison anormale peut laisser des objets IPC orphelins.

9. Suppression des objets

Chaque mécanisme possède un appel de contrôle :

Code: Select all

msgctl()
semctl()
shmctl()
La commande commune importante est :

Code: Select all

IPC_RMID
Exemples :

Code: Select all

msgctl(msqid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID);
shmctl(shmid, IPC_RMID, NULL);
IPC_RMID demande la suppression de l'objet.

Le détail exact du moment de suppression dépend du type d'objet.

10. IPC_STAT et IPC_SET

Les appels de contrôle utilisent aussi :

Code: Select all

IPC_STAT
IPC_SET
IPC_STAT

Récupère les métadonnées de l'objet dans une structure propre au mécanisme.

Exemples :

Code: Select all

struct msqid_ds
struct semid_ds
struct shmid_ds
IPC_SET

Modifie certains champs autorisés, notamment certaines permissions ou propriétés administratives.

11. Commande ipcs

La commande :

Code: Select all

ipcs
affiche les objets System V IPC existants.

On peut afficher séparément :

Code: Select all

ipcs -q    // message queues
ipcs -s    // semaphores
ipcs -m    // shared memory
Elle est très utile pour le debug.

12. Commande ipcrm

ipcrm permet de supprimer manuellement un objet System V IPC laissé dans le kernel.

Exemples selon les systèmes :

Code: Select all

ipcrm -q <msqid>
ipcrm -s <semid>
ipcrm -m <shmid>
Utiliser ipcrm avec prudence : supprimer un objet encore utilisé peut casser les processus qui en dépendent.

13. /proc/sysvipc

Linux expose également des informations via :

Code: Select all

/proc/sysvipc/msg
/proc/sysvipc/sem
/proc/sysvipc/shm
Ces fichiers permettent d'inspecter les objets System V IPC présents sur la machine.

14. Comparaison des trois mécanismes

Code: Select all

MESSAGE QUEUE
    |
    +-- échange de messages
    +-- frontières des messages conservées
    +-- msgget / msgsnd / msgrcv / msgctl

SEMAPHORE
    |
    +-- synchronisation
    +-- ne transporte pas les données
    +-- semget / semop / semctl

SHARED MEMORY
    |
    +-- partage direct de mémoire
    +-- très rapide
    +-- nécessite une synchronisation séparée
    +-- shmget / shmat / shmdt / shmctl
15. Quand utiliser quoi ?

Message queue

Utile lorsque les processus doivent échanger des messages complets et distincts.

Semaphore

Utile pour protéger une ressource partagée ou coordonner l'ordre d'exécution de plusieurs processus.

Shared memory

Utile pour partager efficacement un volume de données important entre plusieurs processus.

16. Points importants à retenir
  • key_t sert à identifier logiquement un objet.
  • l'identifiant retourné par le kernel est ensuite utilisé pour les opérations.
  • IPC_CREAT crée l'objet s'il n'existe pas.
  • IPC_EXCL permet de détecter qu'un objet existe déjà.
  • les objets System V IPC peuvent survivre au processus créateur.
  • IPC_RMID sert à les supprimer.
  • ipcs permet de les inspecter.
  • ipcrm permet de les supprimer manuellement.
  • System V IPC comprend message queues, semaphores et shared memory.
17. API essentielle

Code: Select all

ftok()

msgget()
msgsnd()
msgrcv()
msgctl()

semget()
semop()
semctl()

shmget()
shmat()
shmdt()
shmctl()

Who is online

Users browsing this forum: No registered users and 1 guest