[英]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.