Очередь сообщений — динамический размер сообщения — C

#c #dynamic #ipc #message-queue

#c #динамический #ipc #очередь сообщений

Вопрос:

Я использую статический размер сообщения для очереди сообщений IPC:

 /* header */
typedef struct{  
    long type;  
    char data[BUFFER_SIZE];
}msg;

/* main */
msg m;
msgrcv(queueid, amp;m, BUFFER_SIZE, 0, 0);
  

но мне нужно использовать динамический размер данных. Что-то вроде

 // header
typedef struct{  
    long type;  
    char *data;
}msg;

// main
msg m;
m.data = (char*) malloc( BUFFER_SIZE );
msgrcv(queueid, amp;m, BUFFER_SIZE, 0, 0);
  

Но когда я использую это, он ничего не считывает из очереди, и процесс блокируется.

Спасибо за ваше время и приношу извинения за мой плохой английский…

Ответ №1:

Сообщения произвольной длины передаются через msgsnd() и msgrcv() вот так:

 typedef struct{  
    long type;  
    char data[1];
}msg;

msg * m = malloc(sizeof(msg) - 1   NeededSize);
msgrcv(queueid, m, NeededSize, 0, 0);

... // treat m as if the data array was NeededSize elements long
free(m);
  

Это позволяет изменять необходимый размер для отдельных сообщений.

Комментарии:

1. @Mat: Довольно распространенный, в частности, в Windows API. Имеет смысл и для этих очередей сообщений.

2. Спасибо, это то, что я искал