2016-09-22 10 views
1

Я пытаюсь передать строковое содержимое другому процессу, используя 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; 
    } 
+0

Я думаю, может быть несколько проблем с вашим кодом. Отправка 'text.size()' не отправляет завершающий нуль. Я бы также избежал использования 'message [0]' construct при получении. Если вы хотите это сделать, используйте вместо этого вектор. '.data()' тоже чище. Не забывайте о завершающем нуле, когда вы переводите вектор в строку. –

+0

такой же выпуск. Ничего не изменилось. Ниже моего кода. 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); –

+0

@AdrianRoman нет завершающего NUL (по крайней мере, никакого значимого, то, что std :: string добавляет чисто для унаследованного взаимодействия). Фактически, внутри строки может быть много символов NUL. – sehe

ответ

3

Где вы создаете очередь сообщений у вас есть sizeof(char) но вы пытаетесь поставить 4 символа в буфере. Отслеживание оскорблений исключение составляет:

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

В 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 ', в то время как interprocess будет просто выполнять memcpy полезной нагрузки. При этом второй размер не нужен. Я думаю, вы неправильно поняли, что я имел в виду, или я не понимаю. – lakeweb

+0

'ciao' не печатает без завершающих символов, потому что буфер обнуляется. Он печатает без завершающих символов, потому что длина строки составляет 5 байтов (она не будет печатать конечный мусор, даже если размер не будет нулевым буфером) – sehe

Смежные вопросы