删除邮件队列

时间:2015-07-28 08:25:16

标签: c ipc message-queue

我对在C / C ++程序中删除消息队列的方式感到困惑。 我看到了here

  

删除消息队列

     

您可以使用ipcrm命令删除邮件队列(请参阅ipcrm(1)       参考页面),或通过调用msgctl()并传递IPC_RMID命令       码。在许多情况下,消息队列意味着在范围内使用       只有一个程序,你不希望队列在之后持久存在       终止该计划。调用msgctl()删除队列作为其中一部分       终止。

然后是mq_unlink

的其他内容

我很困惑现在完全删除邮件队列的方法是什么

现在让我告诉我正面临的问题。 我在我的应用程序中创建了2个消息队列 现在突然有信号到来并将控制传递给信号处理程序。在信号处理程序中,我正在重新启动我面临错误"Resource temporarily Unavailable"的服务。我已经在信号处理程序中关闭了一个带有mq_close()的队列。可能是因为我没有关闭另一个问题。但我怀疑的是:

  • 我需要关闭吗?
  • 我需要将其删除吗?
  • 如果我必须将其删除,是否需要使用msg_ctlmq_unlink

1 个答案:

答案 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消息队列,则必须取消链接(这也将关闭它)。