我使用C中的消息队列机制发送消息。但是msgrcv函数有一些问题。它将错误显示为无效的参数。请检查一下这个。
//msgrcv.c
#include"msgbuf.h"
int main()
{
int msqid;
key_t key;
message_buf *rbuf;
rbuf=malloc(sizeof(*rbuf));
// rbuf->m=malloc(sizeof(M1));
key = ftok("/home/user",'a');
if ((msqid = msgget(key, IPC_CREAT)) ==(key)-1)
{
perror("msgget");
exit(1);
}
/* Receive an answer of message type 1. */
if (msgrcv(msqid, &rbuf, sizeof(rbuf->m), 1, 0) < 0)
{
perror("msgrcv"); //invalid argument to msgrcv
exit(1);
}
/* Print the answer. */
printf("Received message text= %s\n", rbuf->m.cp);
return 0;
}现在是msgbuf.h
//msgbuf.h
typedef struct msgclient
{
int msglen;
int msgtype;
char *cp;
}M1;
typedef struct msgbuf1
{
long mtype;
M1 m;
} message_buf;我还想知道如何使用消息队列实现双向通信。我是否需要建立两个消息队列来实现两个进程之间的通信?同样的示例代码也是受欢迎的。
谢谢:)
发布于 2014-03-25 07:00:23
我猜这个
if ((msqid = msgget(key, 0666)) ==key-1)应该是
if ((msqid = msgget(key, 0666)) == -1)来自msgrcv
误差 如果以下情况下,msgrcv()函数将失败: ..。 EINVAL msqid不是有效的消息队列标识符。
此外,message_buf.m不能是指针,而必须是成员
typedef struct msgbuf1
{
long mtype;
M1 m;
} message_buf;然后,您可以将此调用保存到malloc
rbuf->m=malloc(sizeof(M1));对msgrcv的调用应该是
if (msgrcv(msqid, rbuf, sizeof(rbuf->m), 1, 0) < 0)否则,msgrcv将覆盖您的堆栈。
更新:
来自msgget
误差 恩诺特 参数键不存在消息队列标识符,且(msgflg & IPC_CREAT)为0。
这意味着,你必须打电话
if ((msqid = msgget(key, IPC_CREAT | 0666)) == -1)至少这是你第一次调用这个函数。
发布于 2014-03-25 06:59:51
我已经看到一个巨大的问题:
message_buf *rbuf;
rbuf=malloc(sizeof(rbuf));因为rbuf是一个指针,所以您应该使用
rbuf=malloc(sizeof(*rbuf));原始数据给出了指针的大小(通常是当前编译器中的4或8个字节),而不是需要的message_buf结构的大小。
另一个问题是您与key-1的比较,我认为它应该是(key)-1。
这可能是你的msgget失败了,而且,由于这个错误的检查,你没有发现它。这意味着msgrecv将使用-1作为队列ID,从而解释那里的失败。
https://stackoverflow.com/questions/22627307
复制相似问题