开发者

Message queue msgsnd mtext field

When usin开发者_JAVA百科g msgsnd the structure mentioned in man page is

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

But if you use it like

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

Assign ptr to some local array[200] (array could be got as a parameter in function), the message received on the other side is junk. Why is this?


It's junk because the structure you have specified is not of the form that msgsnd wants. It expects the data to be copied to immediately follow the mtype value in memory, not be in an array somewhere else.

If you want to send an array of length 200, you need to do something like:

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

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

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


Even if this wasn't wrong for the reasons caf points out, let's say you did something like:

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

If a different process is reading the queue, what would ptr mean to it? What would it point to, if anything, in a different address space?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜