2015-09-20 92 views
0

我正在使用boost消息队列在不同的进程间进行通信。我正在传输一个Packet类型的对象。为此,我在发送和接收函数中使用序列化和反序列化。Boost Interprocess发送给出错误:boost :: interprocess_exception :: library_error

然而,当我尝试发送数据时,我收到此错误: 的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

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

任何帮助非常赞赏。我有点卡住,因为异常消息也不清楚。 我使用升压1_57_0

RGDS 萨班

+0

你试过调试吗?在gdb中,catch catch有帮助。另外,在(de)序列化函数体中添加错误处理(我不确定它们是否被使用)。特别是,捕获存档异常。 – sehe

+0

Catchpoint 3(异常抛出),__cxxabiv1 :: __ cxa_throw(obj = 0x625770,tinfo = 0x416c90 , dest = 0x4077a2 )at ../../../../../src/lnx64/libstdc++-v3/libsupc++/eh_throw.cc:71 71 ../../../../../ src/lnx64/libstdC++ - v3/libsupC++/eh_throw.cc:没有这样的文件或目录。 – Sapan

+0

只是为了补充说,执行mq.send函数时出现异常 – Sapan

回答

0

尝试关闭或使用字符串前冲洗串蒸汽。

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

这也没有帮助。我在gdb中添加了catch抛出异常。不要确定这个例外的含义 – Sapan

相关问题