如何在IPC队列中对消息进行排序

时间:2013-07-08 14:06:38

标签: message-queue ipcs msgrcv

我需要知道是否已经输入了IPC队列中的消息。 在实践中,我需要知道当一个msgrvc函数调用时,我得到的第一个消息是否被队列消失,或者所选消息是否是随机的。

现在,我提出这个问题,因为当在代码msgrcv的一部分内部获得一条不是用于该代码的消息时,我通常会重新排队消息e阅读队列中的以下消息。 我想知道的是,例如,他关注的是消息

  

msgA,msgB,msgC

,存储在队列中 如果阅读 msgA 并取消它,我将获得包含此新订单消息的队列

  

msgB,msgC,msgA

所以以下对msgrcv的调用会给我msgB 或者如果该顺序是随机的,那么我可以再次阅读msgA

谢谢,恩佐

3 个答案:

答案 0 :(得分:2)

消息队列通常作为先出缓冲区中的第一个,但有一些方法可以修改它。

  • 如果您将 msgtyp 设置为零来调用msgrcv(),您将获得队列中的第一条消息。
  • 如果您将 msgtyp 设置为>来调用它0队列将仅返回与 msgtyp 指定的数字对应的类型的消息,并且该子集仍将以先进先出的方式传递。
  • 如果您将 msgtyp 设置为< 0第一条消息的类型设置等于或小于 msgtyp 的绝对值将被返回,但它又是先出先出。

The Linux Programming Interface中有一个很好的例子,见第46.2.2节。

将消息返回到同一队列时,您将始终遇到的问题是,您迟早会遇到它,如果它不适合第一次使用的线程,我假设它会在第二次以及随后的时间也不合适。

您是否考虑使用令牌环类型方法,并设置了多个消息队列?即您的线程接收到第一个队列,如果该消息已被读取但不感兴趣,则将其置于第二个队列以供下一个线程使用;然后这将继续,直到所有线程都读取了逐渐减少的消息集。

答案 1 :(得分:0)

好像你想要从IPC msg队列中选择要读取的内容。 您可以使用msgrcv和msgsnd的消息类型参数而不是重新排队。

答案 2 :(得分:0)

正如其名称所示,IPC消息队列是一个队列,因此重新排队可行。

我怀疑它会比选择类型更快,msgrcv只需检查队列中每条消息的类型,直到它找到具有该类型的第一条消息。您的代码,删除邮件,检查类型并再次对其进行排队。