管道与消息队列

min*_*nt9 17 linux ipc

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

hro*_*tyr 21

在我的脑海中,假设您谈论posix消息队列(而不是SysV消息队列):

  • 管道的大小不受限制,消息队列也是如此.
  • 管道可以集成在使用文件描述符系统,消息队列都有自己的功能集,虽然Linux支持select(),poll(),epoll()和朋友上mqd_t.
  • 管道一旦关闭,需要双方进行一些合作才能重建它们,消息队列可以关闭并在任何一方重新打开,而不需要另一方的合作.
  • 管道是扁平的,就像流一样,强加一个消息结构,你必须在双方实现协议,消息队列已经是面向消息的,不需要小心,比如队列中的第五条消息.


mvd*_*vds 12

真的,它们是非常不同的东西.

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

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

查看man mq_overview和/或man svipc了解更多信息.