2011-04-15 37 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