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.
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
Code: Select all
Message queues : msgget()
Semaphores : semget()
Shared memory : shmget()
Code: Select all
int msqid;
int semid;
int shmid;
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>
Code: Select all
#include <sys/msg.h> // message queues
#include <sys/sem.h> // semaphores
#include <sys/shm.h> // shared memory
Une clé System V IPC est représentée par :
Code: Select all
key_t
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);
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);
Code: Select all
key_t key = ftok("/tmp/app.ipc", 'A');
if (key == (key_t)-1) {
perror("ftok");
}
- d'un chemin existant ;
- d'un identifiant de projet.
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);
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);
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
- propriétaire ;
- groupe ;
- autres.
Les métadonnées communes utilisent notamment une structure de type :
Code: Select all
struct ipc_perm
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
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()
Code: Select all
IPC_RMID
Code: Select all
msgctl(msqid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID);
shmctl(shmid, IPC_RMID, NULL);
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
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
Modifie certains champs autorisés, notamment certaines permissions ou propriétés administratives.
11. Commande ipcs
La commande :
Code: Select all
ipcs
On peut afficher séparément :
Code: Select all
ipcs -q // message queues
ipcs -s // semaphores
ipcs -m // shared memory
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>
13. /proc/sysvipc
Linux expose également des informations via :
Code: Select all
/proc/sysvipc/msg
/proc/sysvipc/sem
/proc/sysvipc/shm
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
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.
Code: Select all
ftok()
msgget()
msgsnd()
msgrcv()
msgctl()
semget()
semop()
semctl()
shmget()
shmat()
shmdt()
shmctl()
