2010-08-17 5 views

risposta

18

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 sullo mqd_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.
+0

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

+0

@ 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

+0

okie, ho capito. Grazie a – mint9

9

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.

+1

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. –