0

我正在使用系统 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)

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

有什么技术可以按升序接收消息队列吗?

4

1 回答 1

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 或数据结构。

于 2013-08-06T00:40:23.850 回答