【问题标题】:message queue(IPC) receiving process not printing the received data in C消息队列(IPC)接收过程未在 C 中打印接收到的数据
【发布时间】:2014-05-03 03:26:33
【问题描述】:

我正在 C linux 中实现 IPC 的消息队列机制。下面是我的接收过程。它没有打印收到的消息。它正在生成一个有效的 msqid,我认为 msgrcv 函数的其他参数也是正确的。为什么会这样?

//header files
#include"msgbuf.h"
int main()
{
   int msqid;
   key_t key;
   int msgflg = 0666;
   message_buf  *rbuf;
   rbuf=malloc(sizeof(*rbuf));
   rbuf->m=malloc(sizeof(M1));
   key = ftok("/home/user",12);
   if ((msqid = msgget(key, msgflg)) ==-1)
   {
        perror("msgget");
        exit(1);
   }
   printf("\n\n%d\n",msqid);  //working fine till here.
   /* Receive an answer of message type 1.   */
   if (msgrcv(msqid, &rbuf, sizeof(rbuf->m), 1, 0) < 0)
   {
        perror("msgrcv");
        exit(1);
   }
   /* Print the answer.  */
   printf("Received message text= %s\n", rbuf->m->cp);
   return 0;
}

现在是 msgbuf.h

typedef struct msgclient
{
  int msglen;
  int msgtype;
  char *cp;
}M1;


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

【问题讨论】:

  • 我在服务器进程中为cp分配了空间。我这里也需要分配空间吗??
  • 改变甚至没有效果。但是 *rbuf 表示分配给 msglen、msgtype 和 msgclient 的 cp 以及 msgbuf1 的 mtype 的空间。所以虽然不需要。
  • 我知道这是一般方法。但是如果我的数据不是字符数组而是一些结构,那怎么办??

标签: c linux ipc message-queue


【解决方案1】:
if (msgrcv(msqid, &rbuf, sizeof(rbuf->m), 1, 0) < 0)

应该是

if (msgrcv(msqid, &rbuf, sizeof(struct message_buf), 1, 0) < 0)

【讨论】:

  • ** 'sizeof' 对不完整类型'struct message_buf' 的无效应用** 这就是我得到的。
【解决方案2】:

由于两个独立的进程有两个独立的内存区域,因此将指针传递给另一个进程是没有意义的,因为传递的指针,如果它指向接收进程中的任何东西,就不会指向它原来的任何东西指向在始发进程中。

在发送消息缓冲区之前,您需要将 M1 中的 char *cp; 更改为字符数组并将字符串复制到其中。指示字符串长度的长度字节可能也是可取的(但不一定是必需的)。

【讨论】:

  • 感谢@Duck,但两个进程都在同一台机器上。所以传递指针也不应该产生问题。如果我错了,请纠正我。
  • 认为自己更正了。唯一有意义的情况是,如果您在线程之间的队列中传递 ptrs,因为所有线程将共享相同的内存,因为它们在同一个进程中。如果您需要说服自己,您可以尝试自己的方式,但这不是问题开始的原因 - 它不起作用吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2020-11-21
  • 2012-06-26
  • 2013-10-17
  • 2012-11-16
  • 2014-05-02
  • 2010-09-19
  • 2012-01-19
相关资源
最近更新 更多