【问题标题】:Forcefully destroy posix message queue?强行销毁posix消息队列?
【发布时间】:2019-12-06 19:02:26
【问题描述】:

我有一个硬性要求,即强制销毁具有给定名称的 posix 消息队列。

我通过反复试验发现这个命令不会做

 mq_unlink(BROKER_NAME);

上面的问题是即使取消链接后,只要其他线程/进程引用它,队列就存在。

有没有办法强行销毁队列,不问问题?

我还将有文件描述符到队列。

【问题讨论】:

    标签: posix message-queue


    【解决方案1】:

    只要队列还在使用中,就不能强制销毁队列

    POSIX mq_unlink()(我的粗体字):

    如果一个或多个进程在调用mq_unlink() 时打开了消息队列,应推迟销毁消息队列,直到所有对消息队列的引用都已关闭。

    您必须让所有使用队列的进程也关闭它们的连接。

    【讨论】:

    • 谢谢,这是否意味着如果 N procs 正在使用队列,他们都必须 mq_unlink 它?
    • @Ace mq_close() 应该足够了(POSIX 说“关闭”)。但是您可能应该测试一些事情以确保 - 并注意在您调用 mq_unlink() 后进程尝试重新创建队列的竞争条件。
    • 这是我遇到的大问题。删除后我无法可靠地重新创建队列。我从 mq_open 和 errno 22 得到返回值 -1,这暗示队列已经存在错误。
    • @Ace 你确定 errno 22 表明你认为它做了什么吗?你可能有一个XY problem在这里。
    • @pilcrow 我认为是这样,因为如果您重新启动该进程,队列创建将成功完成,并在第一次调用 mq_open() 时返回正 fd。
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2015-04-12
    相关资源
    最近更新 更多