【问题标题】:Removing a message queue删除消息队列
【发布时间】:2015-10-18 16:43:09
【问题描述】:

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

删除消息队列

您可以使用 ipcrm 命令删除消息队列(请参阅ipcrm(1) 参考页),或通过调用msgctl() 并传递IPC_RMID 命令 代码。在许多情况下,消息队列旨在用于 只有一个程序,并且您不希望队列在 该计划的终止。致电msgctl() 删除队列作为 终止。

然后是mq_unlink

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

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

  • 我需要关闭它吗?
  • 我需要删除它吗?
  • 如果我必须删除它,我需要使用msg_ctlmq_unlink吗?

【问题讨论】:

  • 这个“在信号处理程序中我正在重新启动服务”可能不是一个好主意。
  • 是的,我也同意,这是一个非常旧的代码,我不应该更改它,我只需要解决资源暂时不可用的问题。
  • 如果这个问题仍然存在,您可能希望向我们展示相关代码 sn-ps。

标签: c ipc message-queue


【解决方案1】:

首先,有两个不相关的消息队列实现,旧的 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 消息队列,则必须取消链接(这也会关闭它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2016-01-20
    • 2014-06-07
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多