首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mq_receive返回“消息太长”,即使msg_len大于mq_msgsize

mq_receive返回“消息太长”,即使msg_len大于mq_msgsize
EN

Stack Overflow用户
提问于 2021-08-02 21:09:38
回答 1查看 267关注 0票数 0

我试图理解Linux中消息队列的工作原理。

最后,我希望有一个可以在不同线程/进程之间发送和接收内容的程序,但首先,我只创建一个消息队列,并让它在队列中的输入上阻塞,但是mq_receive()返回Message too long

查看文档,此错误指示`msg_len小于消息队列的mq_msgsize属性,但对我来说并非如此。

对不起,如果我错过了一些显而易见的事情,但我想不出来。

代码语言:javascript
运行
复制
#define MAX_MESSAGES 10
#define MAX_MSG_SIZE 256
#define MSG_BUFFER_SIZE MAX_MSG_SIZE + 10


int main() 
{
     mqd_t qd_server, qd_client;
     char in_buffer [MSG_BUFFER_SIZE];
     char out_buffer [MSG_BUFFER_SIZE];
 
    struct mq_attr attr, tmpAttr;  
    attr.mq_flags = 0;
    attr.mq_maxmsg = MAX_MESSAGES;
    attr.mq_msgsize = MAX_MSG_SIZE;
    attr.mq_curmsgs = 0;
    
    
    if ((qd_server = mq_open ("/sp-example-server", O_RDONLY|O_CREAT, 0644, &attr)) == -1) 
    {
         printf("%s\n", strerror(errno));
    }


    if (mq_getattr(qd_server, &tmpAttr) == -1)
    {
               printf("mq_getattr error");
    }

        printf("Maximum # of messages on queue:   %ld\n", tmpAttr.mq_maxmsg);
        printf("Maximum message size:             %ld\n", tmpAttr.mq_msgsize);


    int iret = mq_receive(qd_server, in_buffer, sizeof(in_buffer), NULL);
    if (iret == -1)
    {   
         printf("%s\n", strerror(errno));
    }
    return 0;
}

编辑:

在运行mmq_getattr(qd_server, & tmpAttr)之后,似乎从未设置过属性,这可能是原因之一。那么,为什么没有设置属性呢?

代码语言:javascript
运行
复制
// output:

Maximum # of messages on queue:   10
Maximum message size:             8192
EN

回答 1

Stack Overflow用户

发布于 2021-08-03 02:19:43

您向我们展示的代码没有创建/sp-example-server消息队列。

相反,一些先前的进程使用您为mq_maxmsgmq_msgsize看到的值创建了该队列。如果队列创建者省略了属性规范--即将一个空struct mq_attr *传递给mq_open --那么实现将提供默认值。。在Linux上,这些默认值与您看到的值相匹配。

似乎有些早期版本的代码名为mq_open,具有空属性,因此O_CREAT使队列在您现在正在经历的过程中出现。

为了适应这种情况,您可以重新启动或mq_unlink队列,迫使下一个对mq_open的调用来重新创建它。更重要的是,当您不打开队列O_EXCLusively时,然后使用mq_getattr验证队列的属性。

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

https://stackoverflow.com/questions/68627962

复制
相关文章

相似问题

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