IPC Unix
Voici les sept principaux :
- Tuyau
-
FIFO ou un tuyau nommé
-
Prise de courant et Socket de domaine Unix
- File d'attente des messages
- Signal
- Sémaphore
-
Mémoire partagée
-
Pipe n'est utile que parmi les processus liés comme parent/enfant. Appelez pipe(2)
et fork(2)
. Unidirectionnel.
-
Deux processus non liés peuvent utiliser le FIFO à la différence du plain pipe. Appeler mkfifo(3)
. Unidirectionnel.
-
Bidirectionnel. Destiné à la communication réseau, mais peut aussi être utilisé localement. Peut être utilisé pour différents protocoles. Il n'y a pas de frontière de message pour TCP. Appeler socket(2)
.
-
File d'attente de messages. L'OS maintient le message discret. Voir sys/msg.h .
-
Le signal envoie un nombre entier à un autre processus. Ne fonctionne pas bien avec les multithreads. Appelez kill(2)
.
-
Le sémaphore est un mécanisme de synchronisation pour des processus ou des fils multiples, semblable à une file d'attente de personnes attendant des toilettes. Voir sys/sem.h .
-
La mémoire partagée est une mémoire partagée. Faites votre propre contrôle de la concurrence. Appelez shmget(2)
.
Problème de limite de message
Un facteur déterminant dans le choix d'une méthode plutôt qu'une autre est la question de la limite du message. Vous pouvez vous attendre à ce que les "messages" soient distincts les uns des autres, mais ce n'est pas le cas pour les flux d'octets comme TCP ou Pipe.
Considérons une paire de client et de serveur d'écho. Le client envoie une chaîne de caractères, le serveur la reçoit et la renvoie. Supposons que le client envoie "Hello", "Hello", et "How about an answer ?".
Avec les protocoles de flux d'octets, le serveur peut recevoir "Hell", "oHelloHow", et " about an answer ?"; ou de façon plus réaliste "HelloHelloHow about an answer ?". Le serveur ne sait pas où se trouve la limite du message.
Une vieille astuce consiste à limiter la longueur du message à CHAR_MAX
ou UINT_MAX
et acceptent d'envoyer le message de longueur d'abord dans char
ou uint
. Ainsi, si vous êtes du côté de la réception, vous devez d'abord lire la longueur du message. Cela implique également qu'un seul thread doit effectuer la lecture du message à la fois.
Avec des protocoles discrets comme UDP ou les files d'attente de messages, vous n'avez pas à vous préoccuper de ce problème, mais, sur le plan programmatique, les flux d'octets sont plus faciles à traiter car ils se comportent comme des fichiers et des stdin/out.