Отправка void* объекта через очередь сообщений [linux]

Итак, я реализовал свою собственную библиотеку mpi (упрощенную версию), и мне нужно отправлять / получать между процессами некоторые данные. MPI_Send выглядит следующим образом (void *buf,int count, данные типа данных и т. Д...). Так что это означает, что мне нужно отправить элементы count типа data(char,double или int), указывающие на адрес с помощью buf. Мне нужно отправить их через очередь сообщений (MQ). MPI_Recv принимает примерно те же параметры. На данный момент вот что я делаю в Send и Recv:

    //Sender part of code
    ret=mq_send(mq,buf,sizeof(buf),0);
        if(ret < 0)
    return MPI_ERR_IO;
    //Receiver part of code
    ret = mq_receive(mq, buf, MSGSIZE, NULL );
    if(ret < 0)
    return MPI_ERR_IO;

Сейчас я получаю только первый элемент массива. Как бы я отправил все это? Вот что я имею в виду

    //Sender part of pseudocode
    for(i=0,count)
       element=(cast to datatype)buf[i]; 
       mq_send(mq,element,sizeof,0);
    //Receiver part of pseudocode
    //i receive the count number of elements prior to this message
    for(i=0,count)
       mq_receive(mq,local_variable,etc...)
       somehow store them into my void *buf which i receive as an argument ??

Если что-то не совсем понятно, я отвечу

1 ответ

Решение

Вы указываете объем данных, которые вы помещаете в очередь, с помощью третьего аргумента mq_send. В вашем случае это:

ret=mq_send(mq,buf,sizeof(buf),0);

Предполагая, что buf инициализируется где-то по линии

float f[2];
void *buf = f;

Тогда выражение sizeof(buf) означает: размер указателя называется "buf". Хотя это может работать на некоторых архитектурах, правильный путь будет

ret=mq_send(mq,buf,sizeof(float) * <number of elements>, 0);

что означает размер числа с плавающей точкой, умноженный на количество значений с плавающей точкой, хранящихся в массиве.

В этом случае вы поместите весь массив в очередь. Вы также избежите итерации и будете использовать только постоянное количество сообщений вместо линейного числа.

Другие вопросы по тегам