2016-09-22 1 views
1

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 wollen

boost::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; 
    } 
+0

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. –

+0

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); –

+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

Antwort

3

Wo Sie die Nachrichtenwarteschlange erstellen haben Sie sizeof(char) aber Sie versuchen, 4 Zeichen in den Puffer zu setzen. Das Verfolgen von Schmähungen befindet sich unter:

if (buffer_size > p_hdr->m_max_msg_size) { 
     throw interprocess_exception(size_error); 
    } 

In message_queue.hpp. Mit:

bi::message_queue mq(bi::open_or_create,"messagequeue", 100, 4); 

es funktioniert für "ciao".

+0

Es kann oder darf nicht mit dem NUL-Terminator gefüllt sein. Unabhängig davon wird 'std :: cout << s;' wahrscheinlich einfach implementiert wie 'std :: cout.write (s.data(), s.size())'. Kein NUL Terminator beteiligt, jemals. Es geht um Größe, nicht Sentinels in C++ – sehe

+1

Hi sehe, nach [dieser] (http://www.cplusplus.com/reference/string/string/resize/) wird der Puffer mit Null-Zeichen auf einer 'Zeichenfolge gefüllt: : Ändern Sie die Größe, während der Interprozess nur ein Memcpy der Nutzlast ausführt. Die zweite Größe wurde nicht benötigt. Ich denke, du hast falsch verstanden, was ich meinte, oder ich verstehe es nicht. – lakeweb

+0

'ciao' druckt nicht ohne nachfolgende Zeichen, da der Puffer auf Null gesetzt ist. Es wird ohne abschließende Zeichen gedruckt, da die Länge der Zeichenfolge 5 Bytes beträgt (es würde kein nachkommender Abfall ausgegeben, selbst wenn die Größenänderung den Puffer nicht auf null setzen würde) – sehe

Verwandte Themen