Les fonctions msgctl()
, msgget()
, msgrcv()
, et msgsnd()
sont les fonctions de file d'attente de messages 'System V IPC'. Ils travailleront pour vous, mais ils sont assez lourds. Ils sont standardisés par POSIX.
POSIX fournit également un ensemble de fonctions plus modernes, mq_close()
, mq_getattr()
, mq_notify()
, mq_open()
, mq_receive()
, mq_send()
, mq_setattr()
, et mq_unlink()
ce qui pourrait être mieux pour vous (un tel embarras de richesse).
Cependant, vous devrez vérifier lequel, le cas échéant, est installé sur vos plates-formes cibles par défaut. Surtout dans un système embarqué, il se peut que vous deviez les configurer, voire les installer car ils ne sont pas là par défaut (et il peut en être de même pour la mémoire partagée et les sémaphores).
Le principal avantage de l'un ou l'autre ensemble d'installations de messagerie est qu'elles sont pré-déboguées (probablement) et ont donc déjà résolu les problèmes de concurrence - alors que si vous allez le faire vous-même avec de la mémoire partagée et des sémaphores, vous avez beaucoup de travail à faire pour arriver au même niveau de fonctionnalité.
Alors, (ré)utilisez quand vous le pouvez. S'il s'agit d'une option, utilisez l'un des deux systèmes de file d'attente de messages plutôt que de réinventer le vôtre. Si vous trouvez finalement qu'il y a un goulot d'étranglement de performance ou quelque chose de similaire, alors vous pouvez étudier l'écriture de vos propres alternatives, mais jusque-là — réutilisez !
Les files d'attente de messages System V (celles manipulées par les appels système msg*) ont beaucoup de bizarreries et de pièges. Pour le nouveau code, je vous recommande fortement d'utiliser les sockets de domaine UNIX.
Cela étant dit, je recommanderais également fortement l'IPC à transmission de messages plutôt que les schémas de mémoire partagée. La mémoire partagée est beaucoup plus facile à se tromper et a tendance à se tromper de manière beaucoup plus catastrophique.
Le passage de messages est idéal pour les petits blocs de données et lorsque l'immuabilité doit être maintenue, car les files d'attente de messages copient les données.
Une zone de mémoire partagée ne copie pas les données lors de l'envoi/de la réception et peut être plus efficace pour des ensembles de données plus volumineux au prix d'un modèle de programmation moins propre.