Я пытаюсь передать строковое содержимое другому процессу, используя boost interprocess message_queue. У меня нет проблем, когда я передаю целые числа, но когда я хочу передать буфер, лежащий в основе std::string, возникает исключение
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]
при получении. Если вы хотите сделать это, используйте вместо этого вектор..data()
тоже чище. Не забывайте о завершающем нуле, когда вы также переводите вектор в строку. - person Adrian Roman   schedule 22.09.2016&message[0]
. Lakeweb дал правильный ответ. Я просто бегло просмотрел код и заметил использование адресов, что может быть опасно. Здесь такого не было, проблема была в другом. - person Adrian Roman   schedule 24.09.2016