我正在使用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