【问题标题】:reading data from message queue by ascending order按升序从消息队列中读取数据
【发布时间】:2013-08-06 13:14:48
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过 posix 消息(“man mq_overview”),它具有与每条消息关联的优先级。问题是在 posix 消息队列的 linux 实现中可以有 32768 个不同的优先级。
  • posix消息队列的问题是我们只能存储10条消息,所以如果我们不从队列中读取数据会发生数据丢失,至少我需要在队列中保存25条消息
  • 可以通过改变/proc/sys/fs/mqueue/msg_max来改变消息限制

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


【解决方案1】:

如果tag 是一个整数(或可以转换为一),那么这就是 mtype 字段的用途。您只需将tag 用作type。

在msgrcv 上,您可以在第四个参数中指定要读取的类型。通常,如果没有该类型的消息要读取,您不想阻止,因此您还应该使用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 或数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2018-07-10
    • 2013-10-22
    • 1970-01-01
    • 2014-10-28
    • 2022-01-04
    • 2010-09-19
    • 2020-11-27
    相关资源
    最近更新 更多