2012-01-27 270 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