首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >msgrcv()中的错误:通过C中的消息队列接收数据

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

Stack Overflow用户
提问于 2014-03-25 06:51:13
回答 2查看 5.3K关注 0票数 0

我使用C中的消息队列机制发送消息。但是msgrcv函数有一些问题。它将错误显示为无效的参数。请检查一下这个。

代码语言:javascript
复制
//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

代码语言:javascript
复制
 //msgbuf.h
typedef struct msgclient
{
   int msglen;
   int msgtype;
   char *cp;
}M1;

typedef struct msgbuf1
{
   long    mtype;
   M1      m;
} message_buf;

我还想知道如何使用消息队列实现双向通信。我是否需要建立两个消息队列来实现两个进程之间的通信?同样的示例代码也是受欢迎的。

谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-25 07:00:23

我猜这个

代码语言:javascript
复制
if ((msqid = msgget(key, 0666)) ==key-1)

应该是

代码语言:javascript
复制
if ((msqid = msgget(key, 0666)) == -1)

来自msgrcv

误差 如果以下情况下,msgrcv()函数将失败: ..。 EINVAL msqid不是有效的消息队列标识符。

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

代码语言:javascript
复制
typedef struct msgbuf1
{
   long    mtype;
   M1      m;
} message_buf;

然后,您可以将此调用保存到malloc

代码语言:javascript
复制
rbuf->m=malloc(sizeof(M1));

msgrcv的调用应该是

代码语言:javascript
复制
if (msgrcv(msqid, rbuf, sizeof(rbuf->m), 1, 0) < 0)

否则,msgrcv将覆盖您的堆栈。

更新:

来自msgget

误差 恩诺特 参数键不存在消息队列标识符,且(msgflg & IPC_CREAT)为0。

这意味着,你必须打电话

代码语言:javascript
复制
if ((msqid = msgget(key, IPC_CREAT | 0666)) == -1)

至少这是你第一次调用这个函数。

票数 0
EN

Stack Overflow用户

发布于 2014-03-25 06:59:51

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

代码语言:javascript
复制
message_buf  *rbuf;
rbuf=malloc(sizeof(rbuf));

因为rbuf是一个指针,所以您应该使用

代码语言:javascript
复制
rbuf=malloc(sizeof(*rbuf));

原始数据给出了指针的大小(通常是当前编译器中的4或8个字节),而不是需要的message_buf结构的大小。

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

这可能是你的msgget失败了,而且,由于这个错误的检查,你没有发现它。这意味着msgrecv将使用-1作为队列ID,从而解释那里的失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22627307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档