#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. Спасибо, это то, что я искал