Le funzioni msgctl()
, msgget()
, msgrcv()
e msgsnd()
sono le funzioni della coda dei messaggi 'System V IPC'. Lavoreranno per te, ma sono abbastanza pesanti. Sono standardizzati da POSIX.
POSIX fornisce anche un set di funzioni più moderno, mq_close()
, mq_getattr()
, mq_notify()
, mq_open()
, mq_receive()
, mq_send()
, mq_setattr()
e mq_unlink()
che potrebbe essere meglio per te (un tale imbarazzo della ricchezza).
Tuttavia, dovrai verificare quale, se uno dei due, è installato per impostazione predefinita sulle piattaforme di destinazione. Soprattutto in un sistema embedded, potrebbe essere necessario configurarli o addirittura installarli perché non sono presenti per impostazione predefinita (e lo stesso potrebbe valere per la memoria condivisa e i semafori).
Il vantaggio principale di entrambi i set di strutture per i messaggi è che sono pre-debug (probabilmente) e quindi hanno già risolto i problemi di concorrenza, mentre se lo farai da solo con memoria condivisa e semafori, hai molto di lavoro da fare per raggiungere lo stesso livello di funzionalità.
Quindi, (ri)usa quando puoi. Se è un'opzione, usa uno dei due sistemi di coda dei messaggi piuttosto che reinventarne uno tuo. Se alla fine scopri che c'è un collo di bottiglia nelle prestazioni o qualcosa di simile, puoi esaminare la scrittura delle tue alternative, ma fino ad allora - riutilizza!
Le code dei messaggi di System V (quelle manipolate dalle chiamate di sistema msg*) hanno un sacco di stranezze e trucchi. Per il nuovo codice, consiglio vivamente di utilizzare socket di dominio UNIX.
Detto questo, raccomanderei caldamente anche l'IPC che trasmette messaggi su schemi di memoria condivisa. La memoria condivisa è molto più facile da sbagliare e tende a sbagliare in modo molto più catastrofico.
Il passaggio di messaggi è ottimo per piccoli blocchi di dati e dove è necessario mantenere l'immutabilità, poiché le code di messaggi copiano i dati.
Un'area di memoria condivisa non copia i dati durante l'invio/la ricezione e può essere più efficiente per set di dati più grandi al compromesso di un modello di programmazione meno pulito.