删除邮件队列

问题描述 投票:2回答:1

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

Removing a Message Queue

您可以使用ipcrm命令删除消息队列(请参阅ipcrm(1)参考页面),或者调用msgctl()并传递IPC_RMID命令代码。在许多情况下,消息队列只能在一个程序的范围内使用,并且您不希望队列在该程序终止后保持不变。调用msgctl()删除队列作为终止的一部分。

然后是mq_unlink的其他东西

我很困惑现在完全删除消息队列的方式是什么

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

  • 我需要关闭吗?
  • 我需要将其删除吗?
  • 如果我必须删除它,我需要使用msg_ctlmq_unlink
c ipc message-queue
1个回答
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,则必须取消链接(这也将关闭它)。

© www.soinside.com 2019 - 2024. All rights reserved.