2012-01-27 240 views
1

我有在C mq_open一个问题,它试图创建一个队列,但我发现下面的错误ENOMEM。我觉得我可能试图创造许多队列而不解开它们,现在我超过了允许的数量。有没有办法显示和删除这些队列?即使在应用程序关闭之后,这似乎仍然存在,所有后续的创建尝试也失败。消息队列ENOMEM

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

你有*任何*调用'mq_close'吗? – spraff 2012-01-27 15:24:49

+0

我这样做,但代码在被击中之前失败。 – JohnB 2012-01-27 15:30:08

+0

如果您尝试在我的答案中加载'/ dev/mqueue',您会看到什么? – pilcrow 2012-01-27 15:46:35

回答

3

你问:

有没有办法显示和删除论文队列?

这并不容易。通常的嫌疑人(ipcsipcrm)被设计为系统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 ... 
+0

谢谢你解决了它。你是正确的mq_open's不会被ipcs显示。我没有/ dev/mqueue目录,但是一旦创建了所有队列出现,这只是一个案例或删除条目。谢谢 – JohnB 2012-01-27 16:06:51