消息队列 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_close
的anything?
我有,但代码在被击中之前就失败了。
如果您尝试按照我的回答安装/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的主要内容,如果未能解决你的问题,请参考以下文章