gpt4 book ai didi

queue - mq_接收 : message too long

转载 作者:行者123 更新时间:2023-12-02 17:49:17 25 4
gpt4 key购买 nike

我正在使用队列实现两个进程之间的通信。问题是,当我调用函数 mq_receive 时,出现此错误:消息太长。

我已完成以下操作:

struct mq_attr attr;

long size = attr.mq_msgsize;
.... // initializing the queue "/gateway"

int rc = mq_receive(gateway, buffer, size, &prio);

如果我打印大小值,我会得到 size=1,而当我打印相同的大小但从另一个程序(通过相同的机制获得)时,我会得到一些不长整数( -1217186280 )...

我怎样才能解决这个错误?......所以当size = 1时,我相信说“消息太长”是正确的,但为什么是1?

附注我也尝试过:

int rc = mq_receive(gateway, buffer, sizeof(buffer), &prio);

但没有结果。

最佳答案

看来你需要更仔细地阅读文档。当您调用 mq_receive 时,您应该传递目标缓冲区的大小。 此大小必须大于队列的 mq_msgsize 属性。此外,队列属性初始化似乎存在错误,导致无法进行正确的 mq_receive 调用。这是标准消息队列 session :

  1. 填充 mq_attr 结构 ( doc ):

    struct mq_attr attr;  
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 33;
    attr.mq_curmsgs = 0;
  2. 在主进程 ( doc ) 中使用 mq_open 创建队列:

    mqd_t queue = mq_open(qname, O_CREAT|O_RDWR, 0644, &attr);
  3. 在写入进程中打开队列进行写入:

    mqd_t queue = mq_open(qname, O_WRONLY);

    并发送一些文本。文本长度必须小于队列的 mq_msgsize 属性 ( doc ):

    mq_send(queue, "some message", strlen("some message")+1, 1);
  4. 在读取器进程中打开队列进行读取:

    mqd_t queue = mq_open(qname, O_RDONLY);

    然后分配缓冲区并接收消息。缓冲区大小 *必须大于队列的 mq_msgsize 属性。在这里,我们创建 50 字节缓冲区,同时 mq_msgsize == 33 ( doc ):

    char rcvmsg[50];
    int iret = mq_receive(queue, rcvmsg, 50, NULL);

另请记住,您应该使用 %ld 来打印 long,而不是 %d

关于queue - mq_接收 : message too long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5625845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com