获取boost message_queue的名称

时间:2018-03-20 17:09:56

标签: c++ boost message-queue

当我创建一个提升消息队列时,在构造函数中我传递名称:

.pubxml

此名称也用于remove方法,以从系统中删除队列:

using boost::interprocess;

//Create a message_queue.
message_queue mq
             (create_only               //only create
             ,"message_queue"           //name
             ,100                       //max message number
             ,sizeof(int)               //max message size
             );

我的问题是:如果我只有消息队列对象,我该如何从中获取队列名称?

1 个答案:

答案 0 :(得分:1)

没有文档化的界面。

即使是在构造时接收名称的shmem对象实现成员m_shmem也是私有的,因此创建子类无助于访问它。

看起来最有希望的那些成员似乎没有有用的价值(至少在我的POSIX系统上):

  • bip::message_queue::m_shmem.get_device().get_mapping_handle().handle反映了-1
  • 的值
  • bip::message_queue::m_shmem.get_device().get_name()反映空字符串

我建议您创建自己的类型来管理您不会重复的信息(这是一个好主意,IYAM):

<强> Live¹ On Coliru

#include <boost/interprocess/ipc/message_queue.hpp>

namespace bip = boost::interprocess;

struct named_message_queue : bip::message_queue {
    template <typename Mode, typename... Args>
    explicit named_message_queue(Mode mode, const char *name, Args... args)
            : bip::message_queue(mode, name, args...), _name(name) {}

    std::string name() const { return _name; }

  private:
    std::string _name;
};

#include <iostream>

int main() {
    named_message_queue mq(bip::create_only, "message_queue", 100, sizeof(int));

    std::cout << "Name: " << mq.name() << "\n";
    mq.remove(mq.name().c_str());
}

打印

Name: message_queue

¹Coliru不支持共享内存