2010-08-17 75 views

回答

18

了我的头顶部,假设你谈POSIX消息队列(不SysV的那些):

  • 管不得有大小限制,消息队列。
  • 管道可以集成在使用文件描述符的系统中,消息队列有自己的一套功能,尽管linux支持select(),poll(),epoll()mqd_t上的朋友。
  • 管道一旦关闭,需要双方进行一定程度的合作才能重新建立,消息队列可以关闭并在任何一方重新打开,而不需要另一端的合作。
  • 管道是扁平的,很像流,强加一个消息结构,你将不得不在双方都实现一个协议,消息队列已经是消息导向了,不必在意第五条消息队列。
+0

好的,非常感谢... 但是我有一个小小的怀疑“管道一旦关闭需要双方支持某种支持”,你的意思是强调管道不是内核持久化和消息队列是.. 。 究竟需要什么样的套管来重新封闭管道一旦关闭? – mint9 2010-08-17 11:15:37

+0

@ mint9:一般来说,您需要抓住SIGPIPE,优雅地处理它,然后'重新打开'管道。我想你可以fork()你的进程(双方),重复你的标准输入/输出,让父母继续运行(他们充当守卫),然后当你关闭你让你的孩子死(两边),并重做叉/ dup/pipe程序。 – hroptatyr 2010-08-17 11:39:58

+0

okie,我明白了。 谢谢 – mint9 2010-08-18 06:49:44

9

他们是非常不同的东西,真的。

最大的实际区别是管道没有“消息”的概念,它只是一个从write()字节到read()字节的管道。接收端必须能够知道程序中哪些数据构成了“消息”,并且您必须自己实现这一点。此外,还定义了字节顺序:字节将按照您输入的顺序出现。一般而言,它具有一个输入和一个输出。

消息队列用于传输具有类型和大小的“消息”。因此,接收端可以等待一个特定类型的“消息”,并且您不必担心这是否完成。多个进程可能发送到同一队列并从中接收。

参见man mq_overview和/或man svipc了解更多信息。

+1

即使在队列中,您也可以发送任何结构作为消息,因此在这种情况下,接收端也必须知道“在您的程序中哪些数据构成了消息。 – 2012-06-25 18:01:03