2013-07-08 48 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節。

將消息返回到同一隊列的問題總是遲早會再次遇到,如果它不適合所討論的線程,那麼我第一次假設它在第二次和隨後的時間也不適合。

您是否考慮過使用令牌環型方法,並設置了多個消息隊列?即第一個隊列由線程接收,如果消息已被讀取但不感興趣,則將其置於第二個隊列中供下一個線程使用;這將繼續,直到所有線程都讀取逐漸減少的消息集。