首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mqueue不发送或接收整个消息

mqueue不发送或接收整个消息
EN

Stack Overflow用户
提问于 2016-02-22 13:37:21
回答 2查看 394关注 0票数 0

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

下面是代码和输出。

代码:

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

产出:

代码语言:javascript
复制
buflen: 8192
adventur
eightcha
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-22 13:42:32

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

要更正您的代码:

  • 使用strlen函数而不是sizeof (在这种情况下,您必须处理最终的\0)

  • 替换字符串声明:

char mes2[] = "eightcharacters";

票数 0
EN

Stack Overflow用户

发布于 2016-02-22 13:40:03

给出密码

代码语言:javascript
复制
char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);

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

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

https://stackoverflow.com/questions/35555120

复制
相关文章

相似问题

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