отправить и получить структуру в очереди сообщений Posix

Я получаю исключение: file1.c: mq_send: сообщение слишком длинное

Ошибка кажется самоочевидной, но я не могу понять.

У меня есть структура и файлы:

typedef struct {
char path[5011];
char sharedMemSegmentNameBuf[30];
} messageQueueStruct;

файл1.с

#include <sys/mman.h>

#define MAX_CACHE_REQUEST_LEN 5041
    messageQueueStruct mqStruct;
    int maxPathLength = MAX_CACHE_REQUEST_LEN - sizeof(mqStruct.sharedMemSegmentNameBuf);
strncpy(mqStruct.path, path, maxPathLength);
strncpy(mqStruct.sharedMemSegmentNameBuf, sharedMemSegmentNameBuf, sizeof(mqStruct.sharedMemSegmentNameBuf));
if (mq_send(qdCache, (const char *) &mqStruct, sizeof(mqStruct), 0) == -1)
{
    perror("handle_with_cache: mq_send");
    exit(1);
}

файл2.с

    #include <sys/mman.h>

    #define MAX_CACHE_REQUEST_LEN 5041
        struct mq_attr attributes;
        attributes.mq_maxmsg = MAX_MESSAGES;
        attributes.mq_msgsize = MAX_CACHE_REQUEST_LEN;

       messageQueueStruct receiveStruct;
       int maxPathLength = MAX_CACHE_REQUEST_LEN - sizeof(receiveStruct.sharedMemSegmentNameBuf);

    messageQueueStruct receiveStruct;
    if (mq_receive(qdCache, (char *) &receiveStruct, MAX_CACHE_REQUEST_LEN, NULL) == -1)
    {
        perror("process request: mq_receive");
        exit(1);
    }

Мне кажется, что размеры совпадают на стороне приема/отправки. Я также тестировал только буфер char[], и это сработало. Некоторые ссылки, которые я просмотрел:

отправить структуру в mq_send

https://w3.cs.jmu.edu/kirkpams/OpenCSF/Books/cs361/html/MessPassMQ.html


person JoeG    schedule 31.03.2019    source источник
comment
Опубликуйте минимально воспроизводимый пример.   -  person jwdonahue    schedule 31.03.2019
comment
Вы читали документацию по mq_send? В вашей собственной документации указано, что длина сообщения не может превышать mq_attr.mq_msgsize.   -  person jwdonahue    schedule 31.03.2019
comment
Я прочитал документацию, если я что-то упустил, в моем коде выше нет сообщения больше, чем mq_attr.mq_msgsize. Но мне кажется, что документация противоречит этому. Следующее взято из справочных страниц. Аргумент msg_len определяет размер буфера, на который указывает msg_ptr; это должно быть больше или равно атрибуту mq_msgsize очереди   -  person JoeG    schedule 31.03.2019
comment
Исправление: справочные страницы, которые я цитировал выше, взяты из mq_receive(). Так что для меня это имеет смысл и не противоречит тому, что сказал @jwdonahue.   -  person JoeG    schedule 31.03.2019
comment
Где вы устанавливаете атрибут msgsize? Покажите полный пример программы. А вы уверены, что ваша структура такого размера?   -  person Shawn    schedule 31.03.2019
comment
(не имеет отношения к вашему вопросу, но убедитесь, что вы прочитали, что делает strncpy(), прежде чем принять решение об его использовании, поскольку это не то, что ожидает большинство людей)   -  person Shawn    schedule 31.03.2019