IPC System V消息队列 - 发送一个数组的块

时间:2015-12-17 18:14:44

标签: c ipc

我正在编写一个程序,我需要使用消息队列在进程之间传递一个数组片段(不能为这个使用共享内存......)。这个数组片段可能有不同的长度,所以我想知道最好的方法是什么 - 我可以在运行时指定消息大小吗?我知道我可以通过队列传递这样的结构:

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

其中N是在编译时确定的,而AFAIK,我不能做那样的事情:

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

因为指针的内容不会被复制,只有它的值......

那么解决这个价值的最佳方法是什么?我应该选择什么样才能使其有效运作?发送char data[1]好吗?我担心如果很少有进程会请求大表,它会造成瓶颈而且效率不高。我的担忧有效吗?

2 个答案:

答案 0 :(得分: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功能。

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

答案 1 :(得分:2)

分配您的消息结构并发送如下消息:

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 );
}

请参阅http://man7.org/linux/man-pages/man2/msgop.2.html

msgsnd / msgrcv的手册页