Qual è la differenza tra code di messaggi e pipe in Linux?Coda pipe vs msg
risposta
Fuori della parte superiore della mia testa e supponendo che si parla di code di messaggi POSIX (non quelli SysV):
- pipe non sono limitati in termini di dimensioni, code di messaggi sono.
- I tubi possono essere integrati nei sistemi utilizzando i descrittori di file, le code di messaggi hanno il proprio set di funzioni, sebbene linux supporti
select()
,poll()
,epoll()
e amici sullomqd_t
. - I tubi, una volta chiusi, richiedono una certa quantità di cooperazione su entrambi i lati per ristabilirli, le code di messaggi possono essere chiuse e riaperte su entrambi i lati senza la coorte dell'altro lato.
- I tubi sono piatti, proprio come un flusso, per imporre una struttura di messaggi, si dovrebbe implementare un protocollo su entrambi i lati, le code dei messaggi sono già orientate ai messaggi, non occorre fare attenzione per ottenere, ad esempio, il quinto messaggio in la fila.
Sono cose molto diverse, davvero.
La più grande differenza pratica è che una pipe non ha la nozione di "messaggi", è solo una pipe da write()
byte a e da read()
byte da. Il destinatario deve avere un modo per sapere quale parte di dati costituisce un "messaggio" nel tuo programma e devi implementarlo tu stesso. Inoltre, l'ordine dei byte è definito: i byte usciranno nell'ordine in cui li inserirai. E, in generale, ha un input e un output.
Una coda di messaggi viene utilizzata per trasferire "messaggi", che hanno un tipo e una dimensione. Quindi il destinatario può solo aspettare un "messaggio" con un certo tipo, e non devi preoccuparti se questo è completo o meno. Diversi processi possono inviare e ricevere dalla stessa coda.
vedere man mq_overview
e/o man svipc
per ulteriori informazioni.
anche in coda è possibile inviare qualsiasi struttura come messaggio, quindi anche in questo caso il destinatario deve sapere "quale dato costituisce un messaggio nel programma. –
ok, grazie mille ... Ma ho un piccolo dubbio "le pipe una volta chiuse richiedono un qualche tipo di supporto su entrambi i lati", intendi evidenziare il punto che i pipe non sono persistenti del kernel e il messaggio queus è .. E esattamente quale tipo di supporto è necessario per rielaborare il tubo una volta chiuso? – mint9
@ mint9: in generale, è necessario catturare SIGPIPE, gestirlo con garbo, quindi "riaprire" la pipa. Immagino che tu possa forgiare() il tuo processo (su entrambi i lati), dup tuo stdin/stdout, mantenere i genitori in esecuzione (fungono da guardie), poi quando si chiude si lascia morire i bambini (su entrambi i lati) e rifare la forchetta/procedura dup/pipe. – hroptatyr
okie, ho capito. Grazie a – mint9