消息队列msgsnd mtext字段

时间:2010-01-29 09:25:59

标签: linux message-queue

使用msgsnd时,手册页中提到的结构是

 struct mymsg {
     long mtype;    /* message type */
     char mtext[1]; /* body of message */
 };

但是如果你像

一样使用它
func(char *array, int sizeofarray)
{
     struct mymsg {
         long mtype;    /* message type */
         char *ptr; /* body of message */
     };

    msgq.mtype = 1;
    msgq.ptr = array;

    msgsnd(msqid, &msgq, sizeofarray, 0);
}

将ptr分配给某个本地数组[200](数组可以作为函数中的参数获取),另一方接收的消息是垃圾。这是为什么?

2 个答案:

答案 0 :(得分:2)

这是垃圾,因为你指定的结构是{em>不 msgsnd想要的形式。它希望数据被复制到紧跟内存中的mtype值,而不是在其他地方的数组中。

如果要发送长度为200的数组,则需要执行以下操作:

struct mymsg {
    long mtype;
    char mtext[200];
} foo;

foo.mtype = 1;
memcpy(foo.mtext, array, 200);

msgsnd(msqid, &foo, 200, 0);

答案 1 :(得分:0)

即使这个因为caf指出的原因没有错,让我们说你做了类似的事情:

func(char *array)
{
     struct mymsg 
     {
         long mtype;    /* message type */
         char *ptr; /* body of message */
     };

    msgq.mtype = 1;
    msgq.ptr = array;

    msgsnd(msqid, &msgq, sizeof(ptr), 0);
}

如果一个不同的进程正在读取队列,ptr对它意味着什么?如果有的话,它会在不同的地址空间中指出什么?