2015-12-17 114 views
3

我正在編寫一個程序,我需要在使用消息隊列的進程之間傳遞一個數組的片段(不能爲此使用共享內存......) 。這個數組的片段長度可能不一樣,所以我想知道什麼是最好的方法 - 我可以在運行時指定消息大小嗎?我知道我可以通過隊列傳遞的結構是這樣的:IPC系統V消息隊列 - 發送一個數組的塊

struct msg { 
    long type; 
    char data[N]; 
}; 

,其中N是在編譯時確定的,據我所知,我不能做這樣的事情:

struct msg { 
    long type; 
    char *data; 
}; 

因爲內容指針將不會被複制,只有它的值...

那麼解決這個問題的最好方法是什麼?我應該選擇什麼樣的N纔能有效地工作?發送char data[1]好嗎?我很擔心,如果很少的流程會要求大型表格,它會造成一個瓶頸,並且效率不高。我的擔憂是否有效?

回答

2

分配你的消息結構和發送這樣的信息:在http://man7.org/linux/man-pages/man2/msgop.2.html

int sendMessage(int msqid, int flags, long type, const char *data, size_t data_size) 
{ 
    struct msgbuf *msg; 
    size_t msg_size = sizeof(msg->mtype) + data_size; 
    msg = malloc(msg_size); 
    msg->mtype = type; 
    memcpy(msg->mtext, data, data_size); 
    int rc = msgsnd(msqid, msg, msg_size, flags); 
    free(msg); 
    return(rc); 
} 

msgsnd/msgrcv手冊頁

2

定義的最大尺寸爲陣,讓我們說這是1024

#define MAX_SIZE 1024 

聲明你的結構是這樣的:

struct msg { 
    long type; 
    char data[MAX_SIZE]; 
}; 

發送時只發送N字節的內容。

struct msg m; 
// fill the data with N bytes 
msgsnd(msqid, &m, N, msgflg); 

要填寫您可以使用的數據, memcpy功能。

​​

收到時指定最大尺寸,即MAX_SIZE。通過檢查msgrcv的返回值來檢查確實收到了多少字節。

struct msg m; 
N = msgrcv(msqid, &m, MAX_SIZE, msgtyp, msgflg); 
// use the first N data bytes