2011-04-15 36 views
0

我使用静态消息大小要IPC消息队列:消息队列 - 动态消息大小 - Visual C

/* 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); 

但是当我使用它,它不会读取队列中的任何内容,并阻止进程。

感谢您的时间,和我的英文不好道歉......

回答

2

任意长度的消息通过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是个人消息。

+0

@Mat:编辑澄清 – Erik 2011-04-15 13:14:12

+0

谢谢。实际上这是一个非常有趣的技术。 – Mat 2011-04-15 13:17:02

+0

@Mat:很常见,特别是在Windows API中。对于这些消息队列也是有意义的。 – Erik 2011-04-15 13:18:00