通过消息队列发送缓冲区

Dr.*_*all 2 c linux pointers ipc message-queue

嗨,我正在编写一个程序,通过这样的消息队列发送一组字节......

#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);
Run Code Online (Sandbox Code Playgroud)

上面的例子是来自 beejs 网站的一个与我的类似的简单程序。

然而,我正在做的是发送一个带有这样结构的消息......

struct msg_queue{

    long message_type;
    char * buffer;

}
Run Code Online (Sandbox Code Playgroud)

现在,在发送 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);
Run Code Online (Sandbox Code Playgroud)

我在接收指针和读取存储在该字符串中的值时没有问题。但是,如果我要做类似的事情......

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);
Run Code Online (Sandbox Code Playgroud)

我通过我的队列传递到我的另一个进程的指针将读取垃圾而不是存储的值。我尝试将我的任意数组作为静态字符 *,但这也无济于事。我如何正确地通过队列传递我的缓冲区?谢谢。

Duc*_*uck 5

您不应该向另一个进程发送指针,它们在另一个进程的地址空间中没有任何意义(或指向非常不同的东西)。

消息队列不适用于诸如可变长度字符串之类的无界数据。将指针更改为足够大的固定长度字符数组,以容纳最大的字符串,并在写入队列之前将字符串复制到数组中。或者使用另一种类型的 IPC,例如域套接字。