Очередь сообщений - Динамический размер сообщения - C - PullRequest
0 голосов
/ 15 апреля 2011

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

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 15 апреля 2011

Сообщения произвольной длины передаются через 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);

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

...