使用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](数组可以作为函数中的参数获取),另一方接收的消息是垃圾。这是为什么?
答案 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对它意味着什么?如果有的话,它会在不同的地址空间中指出什么?