检查一条消息是不是在 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 消息队列中而没有从队列中删除它?的主要内容,如果未能解决你的问题,请参考以下文章