移除消息队列

4
我对在C/C++程序中删除消息队列的方法感到困惑。我在这里看到:
删除消息队列: 您可以使用ipcrm命令(请参阅ipcrm(1)参考页面)或调用msgctl()并传递IPC_RMID命令代码来删除消息队列。在许多情况下,消息队列仅用于一个程序的范围内,并且您不希望队列在该程序终止后继续存在。作为终止的一部分,调用msgctl()删除队列。
然后是另外一个方法mq_unlink 我现在很困惑,完全删除消息队列的方法是什么呢?
现在请允许我描述我面临的问题。 我在我的应用程序中创建了2个消息队列。 突然出现一个信号并将控件传递给信号处理程序。 在信号处理程序中,我重新启动了服务,但遇到错误“资源暂时不可用”。在信号处理程序中,我使用mq_close()关闭了其中一个队列。也许问题出在我没有关闭另一个队列。 但是我的问题是:
我需要关闭它吗? 我需要删除它吗? 如果要删除它,我需要使用msg_ctl还是mq_unlink?

1
在信号处理程序中重新启动服务可能并不是一个好主意。 - alk
是的,我也同意这是一段相当古老的代码,我不应该对其进行更改,只需要临时解决资源不可用的问题。 - Vijay
如果这个问题仍然存在,您可能想向我们展示相关的代码片段。 - alk
1个回答

2
首先,有两个不相关的消息队列实现,旧的UNIX System V版本使用 msgget()msgsnd()msgrcv(),而较新的符合POSIX标准的版本在这里描述
如果您正在使用POSIX版本,在程序中仅需使用mq_close关闭它,或者使用mq_unlink完全销毁它,以便在所有打开它的程序中都无法使用。
如果您使用System V版本来关闭队列,则必须使用:
msgctl(MessageQueueIQ,IPC_RMID,NULL);

其中MessageQueueIQ是您队列的ID。

回答您的其他问题,如果您正在使用System V消息队列,则关闭它就足够了;如果您正在使用POSIX消息队列,则必须取消链接它(这也会关闭它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接