2013-08-05 54 views
0

我正在使用系統V消息隊列。在我的程序中,一個線程不斷向消息隊列添加數據,另一個線程從消息隊列中取出數據。從消息隊列中按升序讀取數據

我的消息隊列結構格式是

struct mymsgbuf { 
    long mtype; 
    char mtext[MAX_SEND_SIZE]; 
}; 

當我從消息採取mtext我需要得到的數據升序排列取決於tag

我的消息隊列接收

​​

上述格式返回從第一數據送入消息隊列。

是否有任何技術以升序接收消息隊列?

+0

您是否嘗試過posix郵件(「man mq_overview」),它具有與每封郵件相關的優先級。問題是在linux的posix消息隊列實現中你可以有32768個不同的優先級。 – rbelli

+0

posix消息隊列的問題是我們只能存儲10條消息,所以如果我們不從隊列讀取數據,就會發生數據丟失,最少需要保存隊列中的25條消息 – sujin

+1

您可以通過更改/ proc來更改消息限制/ SYS/FS/mqueue中/ msg_max – Duck

回答

0

如果tag是一個整數(或可以轉換爲一個),那麼這就是mtype字段的用途。您只需使用tag作爲type

msgrcv上指定要在第4個參數中讀取的類型。作爲一項規則,如果沒有該類型的消息被讀取,您不想阻止,因此您還應該使用IPC_NOWAIT標誌。所以要讀取類型/標籤2它將是:

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recvbuf, MAX_SEND_SIZE, 2, IPC_NOWAIT); 

還有一些其他的遊戲,你可以播放閱讀mtypes例如在讀隊列中的第一個消息,它 2型

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recMSG_EXCEPTvbuf, MAX_SEND_SIZE, 2, IPC_NOWAIT | MSG_EXCEPT); 

這些在本msgrcv人頁上介紹。如果你發現你的類型方案變得太複雜了,這可能是你想要咬緊牙關並使用其他類型的IPC或數據結構的標誌。