我对在C / C ++程序中删除消息队列的方式感到困惑。 我看到了here
删除消息队列
您可以使用ipcrm命令删除邮件队列(请参阅
ipcrm(1)
参考页面),或通过调用msgctl()
并传递IPC_RMID
命令 码。在许多情况下,消息队列意味着在范围内使用 只有一个程序,你不希望队列在之后持久存在 终止该计划。调用msgctl()
删除队列作为其中一部分 终止。
然后是mq_unlink
的其他内容我很困惑现在完全删除邮件队列的方法是什么
现在让我告诉我正面临的问题。
我在我的应用程序中创建了2个消息队列
现在突然有信号到来并将控制传递给信号处理程序。在信号处理程序中,我正在重新启动我面临错误"Resource temporarily Unavailable"
的服务。我已经在信号处理程序中关闭了一个带有mq_close()
的队列。可能是因为我没有关闭另一个问题。但我怀疑的是:
msg_ctl
或mq_unlink
?答案 0 :(得分:0)
首先,有两个不相关的消息队列实现,旧的UNIX System V使用msgget()
,msgsnd()
和msgrcv()
以及较新的POSIX兼容的described here。
如果您使用的是POSIX版本,只需在程序中关闭它即可使用mq_close
,或者对于可能打开它的所有程序使用mq_unlink
完全销毁它。
如果您使用System V版本关闭队列,则必须使用:
msgctl(MessageQueueIQ,IPC_RMID,NULL);
其中MessageQueueIQ是队列的ID。
要回答您的其他问题,如果您使用的是System V消息队列,关闭它就足够了,如果您使用POSIX消息队列,则必须取消链接(这也将关闭它)。