【问题标题】:Pipe vs msg queue管道与消息队列
【发布时间】:2011-03-30 21:50:44
【问题描述】:

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

【问题讨论】:

    标签: linux ipc


    【解决方案1】:

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

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

    【讨论】:

    • 好的,非常感谢...但是我有点怀疑“管道一旦关闭就需要双方的某种支持”,您的意思是强调管道不是内核持久性和消息queus 是......一旦关闭管道,究竟需要什么样的支持才能重新安装?
    • @mint9:一般来说,您需要捕获 SIGPIPE,优雅地处理它,然后“重新打开”管道。我想你可以 fork() 你的进程(在两边),复制你的 stdin/stdout,让父母继续运行(他们充当警卫),然后在关闭时让你的孩子死(在两边)并重做 fork/ dup/pipe 过程。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 即使在队列中,您也可以将任何结构作为消息发送,因此在这种情况下,接收端也必须知道“哪些数据构成您程序中的消息。
    • 他们真的传输消息吗?我看了this example on SO,好像只是传输抽象字符,看不到任何消息。
    • @Hi-Angel “消息”是什么意思?
    • 您说消息队列用于传输具有类型和大小的“消息”,我期待like this
    • @Hi-Angel 不同之处在于类型和长度信息由 api 提供 - 它们不是 TLV 中的有效负载的一部分
    猜你喜欢
    • 2013-08-24
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2012-03-23
    • 2011-10-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多