我正在使用系统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)
以上格式从第一个数据发送回消息队列。
是否有任何技术可以按升序接收消息队列?
答案 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或数据结构。