【问题标题】:Is there a way to list names of all shared memory objects?有没有办法列出所有共享内存对象的名称?
【发布时间】:2020-09-24 16:48:04
【问题描述】:

因为可以使用boost的find方法managed_shared_memory访问共享内存对象,比如:

res = segment.find<MyType> ("name");

有没有办法列出某个段中定义的所有共享内存对象的名称?我需要它来调试,但没有找到 boost API。

【问题讨论】:

    标签: c++ linux ubuntu boost shared-memory


    【解决方案1】:

    您可以使用named_begin()named_end() 迭代器。

    一个小演示,它创建各种随机长度的字符串向量并报告找到的数量:

    Live On Coliru

    #include <boost/interprocess/managed_mapped_file.hpp>
    #include <boost/interprocess/containers/string.hpp>
    #include <boost/interprocess/containers/vector.hpp>
    #include <boost/container/scoped_allocator.hpp>
    #include <iostream>
    #include <vector>
    
    namespace bip = boost::interprocess;
    
    using Mem = bip::managed_mapped_file;
    template <typename T = void>
    using Alloc = boost::container::scoped_allocator_adaptor<
            bip::allocator<T, Mem::segment_manager> >;
    using String = boost::container::basic_string<char, std::char_traits<char>, Alloc<char> >;
    template <typename T>
    using Vector = boost::container::vector<T, Alloc<T> >;
    
    int main() {
        auto mf = Mem(bip::open_or_create, "test.bin", 20ul<<30);
        std::cout << "Named #" << mf.get_segment_manager()->get_num_named_objects() << "\n";
    
        using Container = Vector<String>;
    
        for (auto to_create: {"foo", "bar", "qux"}) {
            auto& c = *mf.find_or_construct<Container>(to_create)(mf.get_segment_manager());
            auto n = rand()%10;
            for (int i = 0; i<n; ++i) {
                c.emplace_back(std::to_string(i*i));
            }
        }
    
        std::cout << "Named #" << mf.get_segment_manager()->get_num_named_objects() << "\n";
    
        for (auto it = mf.named_begin(); it != mf.named_end(); ++it) {
            std::string_view name(it->name(), it->name_length());
            std::cout << "Item " << name << " has " <<
                reinterpret_cast<Container const*>(it->value())->size() << " elements\n";
        }
    
    }
    

    打印

    Named #0
    Named #3
    Item bar has 6 elements
    Item foo has 3 elements
    Item qux has 7 elements
    

    当然,我不鼓励使用reinterpret_cast。像往常一样使用find_or_construct 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多