получение исключения library_error при попытке использовать boost::interprocess::message_queue

EDIT также пробовал с boost 1.75

Я изучаю, как использовать очередь сообщений boost::interprocess, я использую пример из документации здесь с одним другим - для другого процесса я использую fork(), но я получаю

boost::interprocess_exception::library_error

когда я пытаюсь читать из очереди; Я использую Boost 1.58 вместо Centos 7.6.

это мой код:

#include <iostream>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <vector>


[[no_discard]]bool RunChiled()
{
  using namespace boost::interprocess;
  try {
    message_queue mq(open_or_create      //open or create
        , "message_queue"     //name
        , 100                 //max message number
        , 100                 //max message size
    );
    message_queue::size_type recvd_size;
    unsigned int priority = 0;
    for (auto num = 0; num < 100; ++num) {
      int number = 0;
      mq.try_receive(&number, sizeof(int), recvd_size, priority);
      if (number != num || recvd_size != sizeof(number))
        return 1;
    }
  }catch(interprocess_exception &ex) {
    message_queue::remove("message_queue");
    std::cout << ex.what() << std::endl;
    return 1;
  }
  message_queue::remove("message_queue");
  return true;
}


int main() {
  using namespace boost::interprocess;
  message_queue::remove("message_queue");
  auto pid = fork();

  if(pid > 0)
  {
    sleep(2);
    auto res = RunChiled();
    std::cout << res;
  } else if(pid == 0)
  {
    boost::interprocess::message_queue mq(create_only,"message_queue", 100, 100);
    for(int i=0; i<100; ++i)
      mq.send(&i,sizeof(i),0);
  }
  return 0;
}

person yaodav    schedule 23.02.2021    source источник
comment
Вы не говорите, на какой платформе вы работаете, но этот поток может помочь: stackoverflow.com/a/49198130/421195 PS: запустить чилед()? Или вы имели в виду "RunChild()"?   -  person paulsm4    schedule 23.02.2021
comment
@paulsm4 Я использую Boost 1.58 вместо Centos 7.6.   -  person yaodav    schedule 23.02.2021


Ответы (1)


Глядя на код здесь передаваемый буфер должен быть не меньше max_msg_size (в вашем случае 100).

person Yehezkel B.    schedule 24.02.2021
comment
@ Я заставляю это работать - я изменяю максимальный размер сообщения на 4 (sizeof (int)) и теперь это работает - person yaodav; 24.02.2021