msgrcv()中出错:通过C中的消息队列接收数据

msgrcv()中出错:通过C中的消息队列接收数据,c,linux,ipc,message-queue,msgrcv,C,Linux,Ipc,Message Queue,Msgrcv,我在C linux中使用消息队列机制发送消息。但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 = fto

我在C linux中使用消息队列机制发送消息。但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;
   }
我还想知道如何使用消息队列进行双向通信。我是否需要创建两个消息队列来完成两个进程之间的通信?同样的示例代码也很受欢迎


谢谢:)

我已经看到一个巨大的问题:

message_buf  *rbuf;
rbuf=malloc(sizeof(rbuf));
因为
rbuf
是指针,所以应该使用

rbuf=malloc(sizeof(*rbuf));
原始版本提供指针的大小(在当前编译器中通常为4或8个字节),而不是所需的
消息\u buf
结构的大小

另一个问题是您与
key-1
的比较,我认为应该是
(key)-1

您的
msgget
可能失败,并且由于此错误检查,您没有检测到它。这意味着
msgrecv
将使用
-1
作为队列ID,解释那里的故障。

我猜这是

if ((msqid = msgget(key, 0666)) ==key-1)
应该是

if ((msqid = msgget(key, 0666)) == -1)
if (msgrcv(msqid, rbuf, sizeof(rbuf->m), 1, 0) < 0)

错误
如果:

[EINVAL]
msqid不是有效的消息队列标识符

此外,
message_buf.m
不能是指针,而必须是成员

typedef struct msgbuf1
{
   long    mtype;
   M1      m;
} message_buf;
然后,您可以将此调用保存到
malloc

rbuf->m=malloc(sizeof(M1));
msgrcv
的调用应该是

if ((msqid = msgget(key, 0666)) == -1)
if (msgrcv(msqid, rbuf, sizeof(rbuf->m), 1, 0) < 0)

至少是您第一次调用此函数。

没有,先生。它给出了msgget()的错误,而不是在做了上述更改之后。在您的问题中,您说的是
msgrcv
。您是否在
msgget
msgrcv
中遇到错误?msgrcv:无效参数这是我在编译后得到的。/a.out.yes。我认为msqid正在制造问题。知道如何生成它吗?修复
if(msgget(…)==-1)
并查看返回值。创作本身看起来不错。我说这是一个问题,可能还有其他问题。无论如何,它需要修复以防止未定义的行为。是的。明白了。:)但是msgrcv的错误仍然存在。msgrcv:无效参数检查更新,您的msgget检查有错误,因此失败将导致msgrcv失败。已进行更新。仍然是msgrcv:权限被拒绝。但是,如果do msqid=msgget(key,IPC|u CREAT | 0666),它将msqid设为-1。这是另一个错误,这个问题得到了回答,它不是用来对话的。我建议你用新问题问一个新问题。