【问题标题】:C mqueue doesn't send or receive the entire messageC mqueue 不发送或接收整个消息
【发布时间】:2016-06-03 23:12:00
【问题描述】:

我尝试使用消息队列实现一个简单的 C 程序,但是该队列不发送或接收长度超过 8 个字符的消息。我试图正确设置所有参数,但我一定遗漏了什么。

下面是代码和输出。

代码:

int main()
{
    mqd_t mq = mq_open("/mq", O_RDWR | O_CREAT, 0666, NULL);
    if (mq == -1) exit(1); 

    char* mes = "adventure";
    int n = mq_send(mq, mes, sizeof(mes), 0);
    char* mes2 = "eightcharacters";
    n = mq_send(mq, mes2, sizeof(mes2), 0);
    if (n == -1) exit(1);

    struct mq_attr attr;
    int buflen;  
    char *buf;

    mq_getattr(mq, &attr);
    buflen = attr.mq_msgsize;
    buf = (char *) malloc(buflen);

    printf("buflen: %d\n", buflen);

    n = mq_receive(mq, (char *) buf, buflen, NULL);
    if (n == -1) { exit(1); }

    printf("%s\n",buf);

    n = mq_receive(mq, (char *) buf, buflen, NULL);
    if (n == -1) { exit(1); }

    printf("%s\n",buf);

    free(buf);
    mq_close(mq);
    return 0;
}

输出:

buflen: 8192
adventur
eightcha

【问题讨论】:

  • 了解sizeofstrlen 之间的区别。然后了解字符串如何终止
  • 关于这一行:int n = mq_send(mq, mes, sizeof(mes), 0); 表达式:sizeof(mes) 获取的是指针的大小,而不是消息内容的长度。建议:int n = mq_send(mq, mes, strlen(mes), 0);

标签: c message-queue mqueue


【解决方案1】:

给定代码

char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);

sizeof(mes)指针 mes 的大小,而不是它指向的字符串的长度。

【讨论】:

    【解决方案2】:

    sizeof 会给你指针的大小(你似乎是在 64 位架构上,所以指针有 8 个字节长)。

    更正您的代码:

    • 使用strlen函数而不是sizeof(在这种情况下,你必须注意最终的\0

    • 替换你的字符串声明:

    char mes2[] = "eightcharacters";

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多