2013-07-08 49 views
0

我需要知道如果消息嵌入在IPC队列中。 在实践中,我需要知道,当一个调用msgrvc函数时,我得到的第一个消息进入队列或选定的消息是随机的。如何排序消息嵌入IPC队列

现在,我提出这个问题,因为当内部的一部分代码msgrcv得到一个消息,它不是针对该代码,我通常要求消息e读取队列中的以下消息。 什么我想知道的就是给定,例如,他下面的消息

MSGA,MSGB,MSGC

,存储队列 内如果读MSGA和reque它,我将得到队列中的消息在这个新秩序

MSGB,MSGC,MSGA

等下面调用msgrcv会给我MSGB 或者如果该顺序是随机的ANS,所以我可以再次阅读MSGA

感谢,恩佐

回答

0

好像你要选择如何从一个读IPC消息队列。 您可以使用msgrcv和msgsnd的消息类型参数,而不是重新排队。

+0

我已经使用了类型参数,但是这个解决方案由于不同消息类型的数量太多而变得太慢了,所以我尝试了一种不同的方法。我不会从队列中读取一个单独的消息类型,而会尝试读取第一个可用的消息,如果不是正确的消息请求它 – enzo2

0

顾名思义,IPC消息队列就是一个队列,所以重新排队会起作用。

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

2

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

  • 如果调用msgrcv()与msgtyp设为零,你会在队列中得到的第一条消息。
  • 如果用msgtyp设置为> 0队列调用它只会有与通过msgtyp指定的号码类型和这个子集仍然会在一个先入先出的方式传递返回消息。
  • 如果用msgtyp集叫它< 0以等于或小于的msgtyp绝对值将被退回,但再一次它是先入先出定了型的第一条消息。

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

将消息返回到同一队列的问题总是迟早会再次遇到,如果它不适合所讨论的线程,那么我第一次假设它在第二次和随后的时间也不适合。

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