【问题标题】:Get the name of a boost message_queue获取 boost message_queue 的名称
【发布时间】:2018-08-29 15:02:03
【问题描述】:

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

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
             );

这个名字也用在 remove 方法中,从系统中删除队列:

message_queue::remove("message_queue");

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

【问题讨论】:

    标签: c++ boost message-queue


    【解决方案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 不支持共享内存

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2012-08-26
      • 2020-08-26
      • 2011-09-06
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多