Я застрял в начальной точке с моей очередью POSIX:

То, что (я думаю) должно блокироваться, вообще не блокируется, и цикл продолжает вращаться. Я пытаюсь заблокировать процесс на mq_receive до тех пор, пока не придет какое-либо сообщение, но похоже, что вызов всегда получает пустое сообщение из очереди (но пока нет клиентов, отправляющих сообщения). Очередь правильно открыта с настройками по умолчанию mq_flags=0.

Я использую Ubuntu 12.04.

Вот код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>

int main(int argc, char **argv) {
    mqd_t qd;
    qd = mq_open("/tempqueue", O_RDONLY | O_CREAT, 0666, NULL);
    if (qd == (mqd_t) -1){
        printf("Problemz");
        return 1;
    }else{
        printf("Coda creata\n");
    }

    char buf[400];

    while(1){
        mq_receive(qd, buf, 400, NULL);
        printf("Ricevo: %s.\n", buf);
    }

    mq_close(qd);
    mq_unlink("/tempqueue");
}
3
Vlad Saftoiu 7 Фев 2013 в 03:49

1 ответ

Лучший ответ

Проверьте возвращаемое значение!

Это почти наверняка "-1" ... и в какой момент вы можете вызвать "perror ()" или проверить "errno" на предмет основной ошибки:

7
user1452483user1452483 7 Фев 2013 в 03:52
Я проверяю возвращаемое значение здесь if (qd == (mqd_t) -1), но возвращаемое значение не равно «-1», на самом деле программа продолжается до цикла while и начинает получать.
 – 
Vlad Saftoiu
7 Фев 2013 в 04:04
1
Вам нужно проверить возвращаемое значение mq_receive внутри цикла while
 – 
nos
7 Фев 2013 в 04:12
1
Спасибо! Я понял это: perror() вернул Message too long, который затем привел меня к проблеме с размером буфера: buf[400] должен быть buf[8192], потому что msgsize очереди это 8192.
 – 
Vlad Saftoiu
7 Фев 2013 в 04:21