Поле сообщений msgsnd mtext - PullRequest
0 голосов
/ 29 января 2010

При использовании msgsnd структура, упомянутая на man-странице, равна

 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 ]

2 голосов
/ 29 января 2010

Это мусор, потому что указанная вами структура не той формы, которую хочет msgsnd. Он ожидает, что данные, которые будут скопированы, будут следовать сразу за значением mtype в памяти, а не находиться в массиве где-то еще.

Если вы хотите отправить массив длиной 200, вам нужно сделать что-то вроде:

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

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

msgsnd(msqid, &foo, 200, 0);
0 голосов
/ 29 января 2010

Даже если это не так по причинам, на которые указывает 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? На что это указывает, если вообще что-то, в другом адресном пространстве?

...