簡體   English   中英

IPC System V消息隊列 - 發送一個數組的塊

[英]IPC System V message queue - sending a chunk of an array

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

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

其中N是在編譯時確定的,而AFAIK,我做不到這樣的事情:

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

因為指針的內容不會被復制,只有它的值......

那么解決這個價值的最佳方法是什么? 我應該選擇什么樣才能使其有效運作? 發送char data[1]好嗎? 我擔心如果很少有進程會請求大表,它會造成瓶頸而且效率不高。 我的擔心有效嗎?

定義數組的最大大小,假設它是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函數。

memcpy(msg.data, your_array + start_index_of_the_slice, N);

接收時指定最大尺寸即MAX_SIZE 通過檢查msgrcv的返回值來檢查實際接收的字節數。

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

分配您的消息結構並發送如下消息:

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的手冊頁,請訪問http://man7.org/linux/man-pages/man2/msgop.2.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM