부울 상호 프로세스 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;
}
코드에 몇 가지 문제가있을 수 있습니다. 'text.size()'를 보내면 끝나는 0을 보내지 않습니다. 수신 할 때'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); –
@AdrianRoman 최소한 NUL은 없다. (적어도 의미있는 것은 아니다. std :: string은 레거시 interop에만 사용된다.) 사실, 문자열 내에 많은 NUL 문자가있을 수 있습니다. – sehe