2016-09-22 11 views
1

ブーストプロセスのmessage_queueを使用して文字列コンテンツを別のプロセスに渡そうとしています。私は整数を渡したときに何の問題を持っていないが、私はのstd ::文字列の基礎となるバッファを渡す場合、例外が文字列を送信するときにブーストメッセージキューがクラッシュする

​​

コードは以下の通りですスローされます。 このクラッシュの原因は何でしょうか?あなたがメッセージキューを作成

// 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

あなたのコードにはいくつかの問題があると思います。 'text.size()'を送信しても、終了するゼロは送信されません。受信時に 'message [0]'を使用することも避けたいと思います。それをしたい場合は、代わりにベクトルを使用してください。 '.data()'もよりクリーンです。ベクトルを文字列に変換するときも、終了するゼロを忘れないでください。 –

+0

同じ問題。何も変わっていません。私のコードの下に。 std :: vector data; 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終わりのNULはありません(少なくとも、意味のあるものはありません。std :: stringが追加するものは、純粋に従来のinterop用です)。実際には、文字列の中に多くのNUL文字がある可能性があります。 – sehe

答えて

3

あなたがsizeof(char)持っていますが、バッファ内の4文字を入れしようとしています。例外の追跡は、次の場所で行われます。

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

In message_queue.hpp。 :

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

"ciao"で動作します。

+0

NULターミネータで埋められている場合とされていない場合があります。それにもかかわらず、 'std :: cout << s;'は単にstd :: cout.write(s.data()、s.size())のように実装されています。 NULターミネーターは一切関与していません。それはサイズではなく、C++でのセンチネルではない – sehe

+1

[this](http://www.cplusplus.com/reference/string/string/resize/)によると、バッファはヌル文字で '文字列: :resize 'プロセスはペイロードのmemcpyを実行します。それで、2番目のサイズ変更は必要ありませんでした。私はあなたが私の意図したことを誤解したと思う、あるいは私はそれを得ない。 – lakeweb

+0

'ciao'は、バッファがゼロ化されているため、末尾の文字は印刷されません。文字列の長さが5バイトであるため、末尾の文字は印刷されません(サイズ変更によってバッファがゼロにならなくても末尾のガベージが印刷されません)。 – sehe

関連する問題