管道和消息队列之间有什么区别?

时间:2010-03-18 14:42:06

标签: unix ipc message-queue pipe vxworks

管道和消息队列之间有什么区别?

请从vxworks& unix观点。

我认为管道是单向的,但消息队列不是。

但是管道内部不使用消息队列,那么管道是如何单向但消息队列不是?

您可以想到的其他差异(来自设计或使用或其他方面)?

5 个答案:

答案 0 :(得分:15)

消息队列是:

  • 单向
  • 固定条目数
  • 每个条目都有最大尺寸
  • 创建时分配的所有队列内存(#entries *条目大小)
  • 类似数据报的行为:读取条目会将其从队列中删除。如果您没有读取整个数据,则其余数据将丢失。例如:发送一个20字节的消息,但接收器读取10个字节。其余10个字节丢失。
  • 任务只能使用msqQReceive在单个队列上挂起(有办法通过替代API更改)
  • 发送时,如果队列已满,您将挂起(并且您没有执行NO_WAIT)
  • 收到时,如果队列为空(并且你没有做NO_WAIT),你将会挂起来
  • 接收和发送时支持超时

管道

  • 是否有一层消息队列< --- Unidirectional!
  • 拥有最大数量的元素,每个元素具有最大尺寸
  • 不是一个流动的界面。数据报语义,只列出消息队列
  • 在阅读时,将发送,直到有数据要阅读
  • 在写入时,将发送,直到基础消息队列中有空格
  • 可以使用select facility等待多个管道

这就是我现在能想到的。

答案 1 :(得分:1)

“VxWorks管道与UNIX管道显着不同”,vxWorks文档说,他们不是在开玩笑。 Here's the manpages

看来,Unix管道和vxWorks管道之间的唯一相似之处在于它们是IPC的一种形式,这似乎并不夸张。功能不同,API不同,实现肯定非常不同。

答案 2 :(得分:0)

我也在IPC in UNIX中发现了这种差异。它指出它们之间的区别在于消息队列和管道是第一个在数据包中存储/检索信息。虽然管道是按字符进行的。

消息队列:

  

消息队列:类似于管道的匿名数据流,但存储   并以数据包的形式检索信息。

  

管道:通过标准输入和接口连接的双向数据流   输出并逐字符读取

我在这里也发现了这个问题:Pipe vs msg queue

答案 3 :(得分:0)

消息队列和管道的比较:   - 可以使用一个消息队列在两个方向上传递数据   - 无需先按先进先出的原则阅读该消息    但可以选择性地处理 来源:见http://www.cs.vsb.cz/grygarek/dosys/IPC.txt

答案 4 :(得分:-1)

MQ具有内核持久性,可以由多个进程打开。