检查一条消息是不是在 POSIX 消息队列中而没有从队列中删除它?

Posted

技术标签:

【中文标题】检查一条消息是不是在 POSIX 消息队列中而没有从队列中删除它?【英文标题】:Check to see if a message is in a POSIX message queue w/o removing it from the queue?检查一条消息是否在 POSIX 消息队列中而没有从队列中删除它? 【发布时间】:2010-06-22 20:21:40 【问题描述】:

POSIX 提供了一种使用其 mq_receive 函数读取消息队列的方法。此函数还将它从队列中删除。我需要找到一种方法来检查消息是否在队列中而不将其删除。

【问题讨论】:

【参考方案1】:

来自 Linux mq_overview(7) 手册页:

轮询消息队列描述符

在 Linux 上,消息队列描述符实际上是一个文件描述符,可以使用 select(2)、poll(2) 或 epoll(7)。这不是便携式的。

【讨论】:

谢谢。是的,我已经“伪造”了它,以便在以检查 msg 队列方式使用 mq_recieve 后立即执行具有高优先级消息的 mq_send 来使其工作。【参考方案2】:

mq_getattr(3)。属性之一是mq_curmsgs。除了您将从epoll() 获得的布尔指示之外,实际获得队列深度也很好。

来自 Linux 手册页:

       struct mq_attr 
           long mq_flags;       /* Flags: 0 or O_NONBLOCK */
           long mq_maxmsg;      /* Max. # of messages on queue */
           long mq_msgsize;     /* Max. message size (bytes) */
           long mq_curmsgs;     /* # of messages currently in queue */
       ;

【讨论】:

【参考方案3】:

您希望在打开消息队列时添加 mq_attr 数据结构,然后使用 mq_getattr 函数获取属性

int mq_getattr(mqd_t mqdes, struct mq_attr *attr);

最后,看看它的 mq_curmsgs 成员

【讨论】:

以上是关于检查一条消息是不是在 POSIX 消息队列中而没有从队列中删除它?的主要内容,如果未能解决你的问题,请参考以下文章

POSIX 消息队列的替代方案

POSIX 消息队列 - 打开时出错:参数无效

redis与rabbitmq做消息队列的区别

Posix消息队列

Posix消息队列

POSIX消息队列