Ich versuche, einen String-Inhalt an einen anderen Prozess zu übergeben, indem ich den Boost-Interprozess message_queue verwendet. Ich habe kein Problem, wenn ich Zahlen passieren, aber wenn ich den Puffer Basiswert eine std :: string eine Ausnahme ausgelöst wirdBoost-Nachrichtenwarteschlange stürzt ab, wenn eine Zeichenfolge gesendet wird
übergeben wollenboost::interprocess_exception::library_error
-Code ist unten. Was könnte der Grund für diesen Absturz sein?
// SENDER process
//
message_queue::remove("messagequeue");
//Create a message_queue.
message_queue mq (create_only,"messagequeue",100,sizeof(char));
std::string text("ciao");
mq.send(text.data(), text.size(), 0);
sleep(100);
// RECV process
//
void get()
{
message_queue mq(open_only,"messagequeue");
unsigned int priority;
message_queue::size_type recvd_size;
std::string message;
message.resize(100);
mq.receive(&message[0], 100, recvd_size, priority);
message.resize(recvd_size);
std::cout << message << std::endl;
sleep(100000);
}
int main()
{
boost:: thread t;
t = boost::thread(get);
t.join();
return 1;
}
Ich denke, es könnte einige Probleme mit Ihrem Code geben. Das Senden von 'text.size()' sendet nicht den abschließenden Nullpunkt. Ich würde auch vermeiden, "message [0]' construct beim Empfangen zu verwenden. Wenn Sie das tun möchten, verwenden Sie stattdessen einen Vektor. '.data()' ist auch sauberer. Vergessen Sie nicht den abschließenden Nullpunkt, wenn Sie den Vektor auch in eine Zeichenkette übersetzen. –
gleiche Ausgabe. Nichts hat sich verändert. Unter meinem Code. Std :: Vektor Daten; data.push_back ('c'); data.push_back ('i'); data.push_back ('a'); data.push_back ('o'); data.push_back ('\ n'); mq.send (data.data(), data.size(), 0); –
@AdrianRoman gibt es keine abschließende NUL (zumindest keine sinnvolle, die, die std :: string hinzufügt, ist rein für Legacy Interop). In der Tat kann es viele NUL-Zeichen innerhalb der Zeichenfolge geben – sehe