我正在使用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 萨班
你试过调试吗?在gdb中,catch catch有帮助。另外,在(de)序列化函数体中添加错误处理(我不确定它们是否被使用)。特别是,捕获存档异常。 – sehe
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
只是为了补充说,执行mq.send函数时出现异常 – Sapan