【问题标题】:Boost Interprocess Send giving error: boost::interprocess_exception::library_errorBoost Interprocess Send 给出错误:boost::interprocess_exception::library_error
【发布时间】:2015-09-20 12:53:28
【问题描述】:

我正在使用 boost 消息队列在不同进程之间进行通信。我正在传输一个 Packet 类型的对象。为此,我在发送和接收函数中使用了序列化和反序列化。

但是,当我尝试发送数据时,出现以下错误: boost::interprocess_exception::library_error

没有提供其他信息。

这就是我创建消息队列的方式。

 for(i = 0; i< PROC_MAX_E ; i++){
        std::string mqName = std::string("mq") + std::to_string(i);
        std::cout << " Size of Packet is " << sizeof(Packet) << std::endl;
        message_queue mq(open_or_create, mqName.c_str(), MAX_QUEUE_SIZE_E, 100*sizeof(Packet)); // size of packet later
      }

这是我的包裹:

 class Packet{
    public :
    Packet();
    Packet(uint32_t aType, uint32_t aProcId);
    ~Packet();
    uint32_t getType();
    union{
      uint32_t  mFuncId;
      //uint8_t   mResult8;
      uint32_t  mResult32;
      //uint64_t  mResult64;
      //bool      mResult;
      //uint8_t*  mAddr8;
      //uint32_t* mAddr32;
      //uint64_t* mAddr64;
      //char      mData[MAX_PACKET_SIZE]; // This will be used to store serialized data
    };

    friend class boost::serialization::access;

    template <class Archive>
    void serialize(Archive & ar, const unsigned int version){
      ar & _mType;
      ar & _mProcId;
      //ar & mData;
      ar & mFuncId;
      //ar & mResult32;
      }


    private :
    uint32_t _mType;
    uint32_t _mProcId;


  }; // end class

} // end namespace

这是我的序列化和反序列化函数:

std::string IPC::_serialize(Packet aPacket){
    std::stringstream oss;
    boost::archive::text_oarchive oa(oss);
    oa << aPacket;
    std::string serialized_string (oss.str());
    return serialized_string;

  }



  Packet IPC::_deserialize(std::string aData){
    Packet p;
    std::stringstream iss;
    iss << aData;
    boost::archive::text_iarchive ia(iss);
    ia >>  p;
    return p;
  }

这是我的发送和接收函数:

bool IPC::send(uint32_t aProcId, Packet aPacket){
    try{
        _mLogFile << "<-- Sending Data to Process : " << aProcId << std::endl;
        //uint32_t data = aPacket;
        std::string mqName = std::string("mq") + std::to_string(aProcId);
        message_queue mq(open_only, mqName.c_str());
        //serialize Packet
        std::cout << "Serializing \n";
        std::string data = _serialize(aPacket);
        std::cout << " Serialized data =" << data.data() << "Size = " << data.size()<< std::endl;
        mq.send(data.data(), data.size(), 0);
        //mq.send(&data, sizeof(uint32_t), 0);
    }catch(interprocess_exception &ex){
        _mLogFile << "***ERROR*** in IPC Send to process : " << aProcId << " " << ex.what() << std::endl;
        std::cout << "***ERROR*** in IPC Send to process : " << aProcId << " " << ex.what() << std::endl;
        _ipc_exit();
    }
  }

我在 mq.send 期间遇到异常

当我只传输整数时,它工作正常。只有序列化和反序列化,我得到这个错误

非常感谢任何帮助。我有点卡住了,因为异常消息也不清楚。 我正在使用 boost 1_57_0

Rgds 萨潘

【问题讨论】:

  • 你试过调试吗?在 gdb 中,catch throw 有帮助。此外,围绕(反)序列化函数体添加错误处理(我不确定它们是否被使用)。特别是,捕获存档异常。
  • Catchpoint 3(抛出异常),__cxxabiv1::__cxa_throw (obj=0x625770, tinfo=0x416c90 , dest=0x4077a2 <:interprocess::interprocess_exception ::>) 在 ../../../../../src/lnx64/libstdc++-v3/libsupc++/eh_throw.cc:71 71 ../../../。 ./../src/lnx64/libstdc++-v3/libsupc++/eh_throw.cc:没有这样的文件或目录。
  • 只是补充一点,在执行 mq.send 函数时出现异常
  • 你有没有...试过查看那里的堆栈 (bt)?
  • 做一些调试和重新排列一些代码,我可以看到错误出现在 _serialize 行 oa ::save<:archive::tracking_type> (this=0x7ffffffffbf40, t=...) at /u/red22/flexras/tools/boost_1_57_0/包括/提升/归档/basic_text_oprimitive.hpp:173

标签: boost boost-serialization boost-interprocess


【解决方案1】:

在使用琴弦之前尝试关闭或冲洗琴弦蒸汽。

std::string IPC::_serialize(Packet aPacket){
    std::stringstream oss; 
    {
        boost::archive::text_oarchive oa(oss);
        oa << aPacket;
    }
    return oss.str();
}

【讨论】:

  • 这也没有帮助。我在 gdb 中添加了 catch throw 并得到了上述异常。不确定该异常是什么意思
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2020-10-26
  • 2021-05-26
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多