0

我需要知道 IPC 队列中的消息是否已排序。在实践中,我需要知道当调用 msgrvc 函数时,我得到的第一条消息是进入队列还是选择的消息是随机的。

现在,我提出这个问题是因为当在代码 msgrcv 的一部分中收到一条不适合该代码的消息时,我通常将消息重新排队,并在队列中读取以下消息。我想知道的是,例如,他关注消息

味精A、味精B、味精C

,存储在队列

msgB , msgC, msgA

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

谢谢,恩佐

4

3 回答 3

2

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

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

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

将消息返回到同一个队列时总是会遇到的问题是迟早你会再次遇到它,如果它不适合第一次有问题的线程,我假设它也不适合在第二次及以后的时间也是如此。

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

于 2014-07-26T20:02:12.997 回答
0

顾名思义,IPC 消息队列是一个队列,因此可以重新排队。

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

于 2013-07-26T17:13:33.593 回答
0

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

于 2013-07-08T14:34:47.403 回答