IPC System V 消息队列 - 发送一个数组块
IPC System V message queue - sending a chunk of an array
我正在编写一个程序,其中我需要使用消息队列在进程之间传递数组片段(不能为此使用共享内存...)。这个数组片段可能有不同的长度,所以我想知道最好的方法是什么——我可以在运行时指定消息大小吗?我知道我可以通过队列传递这样的结构:
struct msg {
long type;
char data[N];
};
其中 N 是在编译时确定的,据我所知,我不能那样做:
struct msg {
long type;
char *data;
};
因为指针的内容不会被复制,只有它的值...
那么解决这个值最好的方法是什么?我应该选择什么 N 才能使其有效工作?发送 char data[1]
可以吗?我担心如果很少有进程请求大 table,它会造成瓶颈并且效率不高。我的担心有道理吗?
定义数组的最大大小,假设为 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
.
的 return 值来检查实际接收了多少字节
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
我正在编写一个程序,其中我需要使用消息队列在进程之间传递数组片段(不能为此使用共享内存...)。这个数组片段可能有不同的长度,所以我想知道最好的方法是什么——我可以在运行时指定消息大小吗?我知道我可以通过队列传递这样的结构:
struct msg {
long type;
char data[N];
};
其中 N 是在编译时确定的,据我所知,我不能那样做:
struct msg {
long type;
char *data;
};
因为指针的内容不会被复制,只有它的值...
那么解决这个值最好的方法是什么?我应该选择什么 N 才能使其有效工作?发送 char data[1]
可以吗?我担心如果很少有进程请求大 table,它会造成瓶颈并且效率不高。我的担心有道理吗?
定义数组的最大大小,假设为 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