Linux 管道与消息队列

Linux 管道与消息队列,linux,ipc,Linux,Ipc,Linux中的消息队列和管道有什么区别?我不知道,假设您谈论的是posix消息队列(而不是SysV消息队列): 管道的大小不受限制,消息队列是 管道可以使用文件描述符集成到系统中,消息队列有自己的函数集,尽管linux支持select()、poll()、epoll()和mqd\t上的好友 管道一旦关闭,需要双方进行一定程度的合作才能重新建立管道,消息队列可以在任何一方关闭并重新打开,而无需另一方的合作 管道是扁平的,很像流,要施加消息结构,您必须在两侧实现协议,消息队列已经是面向消息的,不需要

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

我不知道,假设您谈论的是posix消息队列(而不是SysV消息队列):

  • 管道的大小不受限制,消息队列是
  • 管道可以使用文件描述符集成到系统中,消息队列有自己的函数集,尽管linux支持
    select()
    poll()
    epoll()
    mqd\t
    上的好友
  • 管道一旦关闭,需要双方进行一定程度的合作才能重新建立管道,消息队列可以在任何一方关闭并重新打开,而无需另一方的合作
  • 管道是扁平的,很像流,要施加消息结构,您必须在两侧实现协议,消息队列已经是面向消息的,不需要注意获取(比如)队列中的第五条消息

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

最大的实际区别在于管道没有“消息”的概念,它只是一个管道,用于
write()
bytes-to和
read()
bytes-from。接收端必须有一种方法来知道哪些数据构成程序中的“消息”,并且您必须自己实现这一点。此外,还定义了字节的顺序:字节将按照您放入它们的顺序出现。一般来说,它有一个输入和一个输出

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


有关更多信息,请参见
man mq\U概述
和/或
man svipc

好的,非常感谢。。。但我有一点怀疑“管道一旦关闭,两边都需要某种支持”,您的意思是强调管道不是内核持久性的,而消息queus是。。。那么,一旦管道关闭,需要什么样的支撑才能重新打开管道?@mint9:一般来说,你需要抓住管道,优雅地处理它,然后“重新打开”管道。我想象你可以fork()你的进程(在两边),复制你的stdin/stdout,让父母继续运行(他们充当守卫),然后在关闭时让你的孩子死(在两边)并重做fork/dup/pipe过程。即使在队列中,你也可以将任何结构作为消息发送,所以在这种情况下,接收端也必须知道“在您的程序中,哪些数据构成了消息。它们真的传递消息吗?”?我看了看,它似乎只是传输抽象字符,我看不到任何消息。@Hi Angel,“消息”是什么意思?你说消息队列是用来传输“消息”的,消息有类型和大小,我期望得到一些东西。@Hi Angel区别在于类型和长度信息是由api提供的-它们不像TLV中那样是有效负载的一部分