2016-02-22 2 views
0

В настоящее время я работаю над программой, которая выполняет IPC через очереди сообщений Posix. Теперь мне нужна функция, которая удаляет каждое сообщение этой очереди. Проблема в том, что мои кодовые блокировки. В настоящее время я стараюсь:Как очистить очередь сообщений POSIX?

void clear_mq(std::string queue_name) 
{ 
    struct mq_attr mq_attrs = {0, 10, sizeof(uint8_t), 0}; 

    mqd_t mq = ::mq_open(queue_name.c_str(), O_WRONLY | O_CREAT, 00644, &mq_attrs); 

    if (mq < 0) 
    { 
     std::cout << "Error opening Queue" << std::endl; 
     exit(-1); 
    } 

    struct mq_attr num_messages; 
    if (mq_getattr(mq, &num_messages) == -1) 
    { 
     std::cout << "Error!" << std::endl; 
     exit(-1); 
    } 
    while (num_messages.mq_curmsgs > 0) 
    { 
     uint8_t buf; 
     mq_receive(mq, (char *)&buf, sizeof(uint8_t), NULL); 
     if (mq_getattr(mq, &num_messages) == -1) 
     { 
      std::cout << "Error!" << std::endl; 
      exit(-1); 
     } 
    } 
    mq_close(mq); 
} 

Может ли кто-нибудь указать, что я делаю неправильно? Я не понимаю, почему прием блокируется ... В тот момент, когда я звоню clear_mq, в блоке приема больше ничего нет ...

ответ

0

У вас ИМХО нет тупика. Тем не менее, mq_receive блокирует, пока не получит сообщение (man mq_receive), потому что очередь не открыта с параметром O_NONBLOCK, а mq_open.

Также убедитесь, что вы не пренебрегаете возвращаемым значением mq_receive в цикле.

+0

Да, но я уверен, что он поступает только в вызов 'mq_receive', когда доступны сообщения (через' mq_getattr'). Результат - хороший момент, спасибо! – Nidhoegger

1

Может быть, что mq_receive() терпит неудачу, и вы оказываетесь в бесконечном цикле.

mq_receive() может не работать по различным причинам, например. предоставленный буфер должен, по крайней мере, иметь размер mq-maxsize.

Вы должны проверить возвращаемое значение mq_receive() и выйти из цикла, если он сработает.

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