【发布时间】:2012-10-20 10:19:27
【问题描述】:
嗨,我正在编写一个程序,它通过消息队列发送一组字节,就像这样......
#include <sys/msg.h>
#include <stddef.h>
key_t key;
int msqid;
struct pirate_msgbuf pmb = {2, { "L'Olonais", 'S', 80, 10, 12035 } };
key = ftok("/home/beej/somefile", 'b');
msqid = msgget(key, 0666 | IPC_CREAT);
/* stick him on the queue */
msgsnd(msqid, &pmb, sizeof(struct pirate_msgbuf) - sizeof(long), 0);
上面的例子是一个来自beejs网站的简单程序,和我的很像。
然而,我正在做的是发送一条带有这样结构的消息......
struct msg_queue{
long message_type;
char * buffer;
}
现在,在我发送我的 msg_queue 之前,我创建了一些替代缓冲区,其中包含各种信息,包括空字符等。现在当我做这样的事情时......
struct msg_queue my_queue;
my_queue.message_type = 1;
my_queue.buffer = "My message";
msgsnd(mysqid, &pmb, sizeof(struct msg_queue) - sizeof(long), 0);
接收指针和读取存储在该字符串中的值没有问题。但是,如果我要做类似的事情...
struct msg_queue my_queue;
my_queue.message_type = 1;
my_queue.buffer = sum_buffer_with_lots_of_weird_values; // of type char *
msgsnd(mysqid, &pmb, sizeof(struct msg_queue) - sizeof(long), 0);
我通过队列传递给其他进程的指针将读取垃圾而不是存储的值。我尝试将我的任意数组设为静态字符 *,但这也无济于事。如何通过队列正确传递缓冲区?谢谢。
【问题讨论】:
-
嘿,谢谢,我知道进程有自己的未共享的内存空间。我只是认为,由于指针 = 数组,至少在大多数情况下,msgsend() 只会发送指向动态分配的内存空间的地址,其中 const char * 字符串将发送内容而是固定长度的数组。我想我唯一的选择是使用固定长度的数组,这让我很沮丧。我认为缓冲区 = malloc(number_of_bytes);将与缓冲区[number_of_bytes]; 相同。
标签: c linux pointers ipc message-queue