按升序从消息队列中读取数据

时间:2013-08-05 18:08:56

标签: c++ c linux ipc message-queue

我正在使用系统V消息队列。在我的程序中,一个线程不断地将数据添加到消息队列,另一个线程从消息队列中取出数据。

我的消息队列结构格式是

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

当我从消息中获取mtext时,我需要按升序获取数据取决于tag

我的消息队列接收

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recvbuf, MAX_SEND_SIZE, 0, 0)

以上格式从第一个数据发送回消息队列。

是否有任何技术可以按升序接收消息队列?

1 个答案:

答案 0 :(得分: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或数据结构。