管道与消息队列

时间:2010-08-17 10:25:52

标签: linux ipc

Linux中的消息队列和管道有什么区别?

2 个答案:

答案 0 :(得分:20)

离开我的头顶并假设你谈论posix消息队列(而不是SysV消息队列):

  • 管道的大小不受限制,消息队列也是如此。
  • 管道可以使用文件描述符集成到系统中,消息队列有自己的一组功能,尽管linux支持select()poll()epoll()以及{{1}上的朋友}。
  • 管道一旦关闭,需要双方进行一定程度的合作才能重新建立,消息队列可以关闭并重新打开,而不需要另一方的合作。
  • 管道是扁平的,就像流一样,强加一个消息结构,你必须在双方实现一个协议,消息队列已经是面向消息的,不需要小心,比如,第五个消息队列。

答案 1 :(得分:11)

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

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

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

有关详细信息,请参阅man mq_overview和/或man svipc