消息队列 ENOMEM

Posted

技术标签:

【中文标题】消息队列 ENOMEM【英文标题】:message queue ENOMEM 【发布时间】:2012-01-27 15:21:17 【问题描述】:

我在 C 中遇到 mq_open 问题,它尝试创建队列,但我收到以下错误 ENOMEM。我觉得我可能试图创建许多队列而不取消它们的链接,现在我已经超过了允许的数量。有没有办法显示和删除这些队列?即使在应用程序关闭并且所有后续创建尝试也失败后,这种情况似乎仍然存在。

sprintf(idTmp->name, "/%08x%d", (uint32_t) idTmp, rand());
if ((idTmp->mq = mq_open(idTmp->name, O_CREAT, 0x666, NULL)) == -1)

【问题讨论】:

你有没有调用mq_closeanything 我有,但代码在被击中之前就失败了。 如果您尝试按照我的回答安装/dev/mqueue,您会看到什么? 【参考方案1】:

你问:

有没有办法显示和删除这些队列?

这并不容易。通常的嫌疑人 (ipcs, ipcrm) 是为 System V IPC (msgget(...)) 而设计的,而不是 POSIX IPC (mq_open(...))。

检查您的 mq_overview(7) 手册页 — 您的 Linux 版本可能会在虚拟文件系统上创建消息队列,可以使用典型的管理工具对其进行检查。根据手册页,该文件系统的公开方式如下:

[root]# mkdir /dev/mqueue
[root]# mount -t mqueue none /dev/mqueue
... now ls and rm your way around ...

【讨论】:

感谢这解决了它。你是正确的 ipcs 不显示 mq_open。我没有 /dev/mqueue 目录,但是一旦创建所有队列就会出现,这只是一个案例或删除条目。谢谢

以上是关于消息队列 ENOMEM的主要内容,如果未能解决你的问题,请参考以下文章

如何清空Windows消息队列

消息队列属性及常见消息队列介绍

RabbitMQ 消息队列

Linux进程间通信 --- 消息队列

Redis(五)-特性-消息队列

redis消息队列有没有