2010-08-17 15 views

Respuesta

18

De la parte superior de mi cabeza y suponiendo que habla de colas de mensajes POSIX (no los SysV):

  • tuberías no están limitados en tamaño, colas de mensajes son.
  • Las tuberías se pueden integrar en sistemas que utilizan descriptores de archivos, las colas de mensajes tienen su propio conjunto de funciones, aunque Linux admite select(), poll(), epoll() y amigos en mqd_t.
  • Las tuberías, una vez cerradas, requieren cierta cooperación por ambas partes para restablecerlas, las colas de mensajes se pueden cerrar y volver a abrir en cualquier lado sin la coorporación del otro lado.
  • Las tuberías son planas, muy parecidas a un flujo, para imponer una estructura de mensaje. Debería implementar un protocolo en ambos lados, las colas de mensajes ya están orientadas a mensajes, no se debe tener cuidado para obtener, por ejemplo, el quinto mensaje la cola.
+0

bien, muchas gracias ... Pero tengo una pequeña duda de que "las tuberías una vez cerradas requieren algún tipo de soporte en ambos lados", quiere resaltar el hecho de que las tuberías no son kernel persistentes y los mensajes quese .. ¿Y exactamente qué tipo de soporte se requiere para volver a conectar la tubería una vez cerrada? – mint9

+0

@ mint9: bueno, en términos generales, debe capturar el SIGPIPE, manejarlo con elegancia y luego "volver a abrir" la tubería. Imagino que podría bifurcar() su proceso (en ambos lados), duplicar su stdin/stdout, mantener a los padres en ejecución (actúan como guardias), luego cuando está cerrado deja que sus hijos mueran (en ambos lados) y vuelva a hacer el tenedor/procedimiento dup/pipe. – hroptatyr

+0

okie, lo tengo. Gracias – mint9

9

Son cosas muy diferentes, de verdad.

La mayor diferencia práctica es que una tubería no tiene la noción de "mensajes", es solo una tubería para write() bytes y read() bytes. El receptor debe tener una forma de saber qué parte de los datos constituye un "mensaje" en su programa, y ​​debe implementarlo usted mismo. Además, se define el orden de los bytes: los bytes aparecerán en el orden en que los colocaste. Y, en términos generales, tiene una entrada y una salida.

Una cola de mensajes se utiliza para transferir "mensajes", que tienen un tipo y tamaño. Entonces el receptor puede esperar un "mensaje" con un cierto tipo, y no tiene que preocuparse si esto está completo o no. Varios procesos pueden enviar y recibir desde la misma cola.

ver man mq_overview y/o man svipc para obtener más información.

+1

incluso en la cola puede enviar cualquier estructura como mensaje, así que en este caso también el receptor debe saber "qué parte de los datos constituyen un mensaje en su programa. –