首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux mq_open忽略mq_msgsize属性

linux mq_open忽略mq_msgsize属性
EN

Stack Overflow用户
提问于 2012-09-26 02:57:40
回答 1查看 2.6K关注 0票数 2

所有的,过去认为我是理智的,现在不是那么确定。

我正在尝试创建一个消息队列,它的mq_msgsize属性不是8192,这似乎是默认的。我在下面附上了我的代码--它有许多printf来显示值。如果你能指出我做错了什么,我将永远感激。

代码语言:javascript
复制
bool Subscriber::Subscribe( void )
{
   mqd_t  qid;
   bool   brv = false;
   msg_topic_t topic = this->GetTopic();
   struct mq_attr q_attr;
   int rv = 0;

   if (VALID_TOPIC( topic ))
   {
        if (this->GetName().length() > 0)
        {
            string qnamestr = this->GetName();
            if (qnamestr[0] != '/')
            {   
                qnamestr = "/" + qnamestr; 
                this->SetName(qnamestr);
            }
            const char * qname = (const char *) qnamestr.c_str();

            q_attr.mq_msgsize = 256;
            q_attr.mq_curmsgs = 0;
            q_attr.mq_flags = O_NONBLOCK;
            q_attr.mq_maxmsg = 10;

            qid = mq_open( qname, O_RDONLY|O_CREAT, 0644, &q_attr );
            if ((mqd_t) -1 != qid)
            {   
                rv = mq_getattr(qid, &q_attr );
                if (rv != 0)
                {   perror(" get_attr1 failed: "); }
                printf(" queue size is now: %d\n", q_attr.mq_msgsize);
                if (q_attr.mq_msgsize > 1024)
                {
                    struct mq_attr old_attr;

                    q_attr.mq_msgsize = 1024;
                    rv = mq_setattr( qid, &q_attr, &old_attr);
                    if (rv != 0)
                    {   perror(" could not update message size: "); }
                    rv = mq_getattr(qid, &q_attr );
                    if (rv != 0)
                    {   perror(" get_attr2 failed: "); }
                    printf(" queue size is now: %d\n", q_attr.mq_msgsize);
                }
                this->SetOutboxID( qid );
                brv = true; 
                DLOG(INFO) << " qid = " << qid << endl;
                MessageCenter * mc = MessageCenter::GetInstance();
                mc->AddSubscriber( (Subscriber *) this );
            }
        }
    }
   drain_queue( this->GetOutboxID());
    return( brv );
}

输出如下: queue size now: 8192 queue size now: 8192 queue size now: 8192

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-26 03:21:47

手册页上写着:

mq_maxmsg和mq_msgsize字段是在mq_open(3)创建消息队列时设置的

唯一可以修改的属性是mq_flags中O_NONBLOCK标志的设置。newattr中的其他字段将被忽略。

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

https://stackoverflow.com/questions/12589379

复制
相关文章

相似问题

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