2016-09-22 5 views
1

부울 상호 프로세스 message_queue를 사용하여 다른 프로세스에 문자열 콘텐츠를 전달하려고합니다. 나는 정수를 통과 할 때 아무 문제가 없지만, 나는 표준 : : 문자열의 기초가되는 버퍼를 통과 할 때 예외가문자열을 보낼 때 부스트 메시지 큐가 충돌합니다.

boost::interprocess_exception::library_error

코드는 다음과 같습니다 슬로우됩니다. 이 충돌의 원인은 무엇일까요? 당신이 메시지 큐를 만들

// 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()'를 보내면 끝나는 0을 보내지 않습니다. 수신 할 때'message [0]'구조를 사용하는 것을 피할 것입니다. 그렇게하고 싶다면 대신 벡터를 사용하십시오. '.data()'도 더 깨끗합니다. 벡터를 문자열로 변환 할 때 끝나는 0을 잊지 마라. –

+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 문자를 넣어 위해 노력하고 있습니다. message_queue.hpp에서

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

:을 욕을 추적 예외이다. 다음을 포함합니다 :

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

[이] (http://www.cplusplus.com/reference/string/string/resize/)에 따르면 안녕 sehe는 버퍼가 '문자열에 null 문자로 채워집니다 : : resize '프로세스가 페이로드의 memcpy를 수행하는 동안. 그 때, 두 번째 크기 조정은 필요하지 않았습니다. 나는 당신이 내가 의미하는 것을 잘못 읽은 것 같아요, 그렇지 않으면 이해하지 못합니다. – lakeweb

+0

'ciao'는 버퍼가 0이기 때문에 뒤 따르는 문자없이 인쇄하지 않습니다. 문자열의 길이가 5 바이트이기 때문에 후행 문자없이 인쇄됩니다 (크기를 조정해도 버퍼가 0이 아니더라도 후행 가비지가 인쇄되지 않음). – sehe