Я пытаюсь передать строковое содержимое другому процессу, используя boost interprocess 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()' не отправляет завершающий нуль. Я бы также избежал использования 'message [0]' construct при получении. Если вы хотите это сделать, используйте вместо этого вектор. '.data()' тоже чище. Не забывайте о завершающем нуле, когда вы переводите вектор в строку. –
такой же выпуск. Ничего не изменилось. Ниже моего кода. std :: vector данные; 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 добавляет чисто для унаследованного взаимодействия). Фактически, внутри строки может быть много символов NUL. – sehe